我今天在我们的 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/