gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:43:45 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com