我今天在我们的 Android 代码库中遇到了这个问题,这让我和我的同事们困惑了一段时间。我们以前有这样的类结构:
Foo.java
package test.a;
public abstract class Foo extends View {
protected abstract class InnerFoo {
public InnerFoo() {}
}
protected class Cog {
public Cog() {}
}
}
酒吧.java
package test.a;
public class Bar extends Foo {
private abstract class AbstractInnerBar extends InnerFoo {
protected abstract void someMethod();
}
private class InnerBar extends AbstractInnerBar {
Cog myCog;
public InnerBar() {
myCog = new Cog();
}
protected void someMethod() {}
}
}
我知道这个类结构不一定很简单,但它没有问题。但是,我们最近进行了一些包重组,并意识到 Bar 属于其他地方。因此,我们将它移到不同的包中,并具有几乎相同的结构,但有两个不同的包。
Foo.java
package test.a;
public abstract class Foo extends View {
protected abstract class InnerFoo {
public InnerFoo() {}
}
protected class Cog {
public Cog() {}
}
}
酒吧.java
package test.b; //This is the only change
public class Bar extends Foo {
private abstract class AbstractInnerBar extends InnerFoo {
protected abstract void someMethod();
}
private class InnerBar extends AbstractInnerBar {
Cog myCog;
public InnerBar() {
myCog = new Cog();
}
protected void someMethod() {}
}
}
奇怪的是,在 某些 版本的 Android 上发生更改后,我们会收到如下错误:java.lang.IllegalAccessError: tried to access class test.a.Foo$Cog[]来自类 test.b.Bar$InnerBar。我认为这不会成为问题,因为 Cog 被赋予 protected 可见性,Bar extends Foo 和 InnerBar扩展 InnerFoo。奇怪的是,其他版本的 Android 工作正常(没有错误,没有可见性问题)。我们可以通过将 Cog 声明为 public 来解决这个问题,但这似乎是一个不必要的解决方法。
我们在运行 Android 4.4.4 的摩托罗拉 Moto X(第一代开发者版)上发现了这个问题。我们在运行 Lollipop 的 Nexus 5 或运行 Android 4.1.2 的 Nexus S 上没有问题
任何人都可以阐明这一点吗?
最佳答案
包a 中的抽象类Foo 是默认包private ,您应该将其访问说明符更改为public 以避免任何错误。 否则你的 Cog 类应该没有问题,即使它是 protected 。只需将 Foo 公开即可。
public abstract class Foo{}
关于java - 不同版本 Android 中跨包的 protected 内部类可见性的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27413174/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这
我正在编写一个方法,它将在一个类中定义一个实例方法;类似于attr_accessor:classFoocustom_method(:foo)end我通过将custom_method函数添加到Module模块并使用define_method定义方法来实现它,效果很好。但我无法弄清楚如何考虑类(class)的可见性属性。例如,在下面的类中classFoocustom_method(:foo)privatecustom_method(:bar)end第一个生成的方法(foo)必须是公共(public)的,第二个(bar)必须是私有(private)的。我怎么做?或者,如何找到调用我的cust
如果我使用ruby版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更
protect_from_forgery默认Rails6应用程序不包含在我的应用程序Controller中,但是有嵌入式ruby在主应用程序布局中。这是否意味着protect_from_forgery方法已经被抽象并且在应用程序Controller中不再明确需要?我买了实用程序员的Rails6一书,我唯一能找到的是“csrf_meta_tags()方法设置了防止跨站点请求伪造攻击所需的所有幕后数据”。 最佳答案 对于rails5.2和更高版本,默认情况下在ActionController::Base上启用。查看此提交:https
我安装了ruby版本管理器,并将RVM安装的ruby实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby。有没有办法让emacs像shell一样尊重ruby的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我