java - 不同版本 Android 中跨包的 protected 内部类可见性的差异

标签 java android

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

相关文章:

java - 当我有一个应该停止负数的输入验证时,最小值方法将返回负数

android - 从库项目注册 GCM

android - 无法解析 VideoView.setVideoURI

android - 需要在 HTML webview 中显示文本格式的数据,如 Stack Overflow

java - 在静态类中同步文件输出

java - Java 和 PHP 的简单解密/加密

java - 将 hibernate 对象作为参数添加到 jasperreports

java - libgdx android 不显示模型(黑屏)

java - 在 Android 应用程序中看不到导入的依赖模块类 LibGDX

java - PathVariable 根本不起作用