让我们考虑一下基类:
package base;
public abstract class Base {
protected enum BaseEnum {
FIRST, SECOND, THIRD
}
}
Run Code Online (Sandbox Code Playgroud)
及其子类:
package a;
import base.Base;
public class A {
// The error message appears in case when NestedA is a nested or inner class
protected /* static */ class InnerA extends Base {
protected BaseEnum getEnumA() {
return BaseEnum.FIRST;
}
protected int xxx() {
BaseEnum enumA = getEnumA();
switch (enumA) {
// ^^ base.NestedBase.BaseEnum.values() is defined in an inaccessible class or interface
case FIRST:
case SECOND:
return 1;
default:
return 2;
}
}
protected int xxx2() {
BaseEnum enumA = getEnumA();
if (enumA == BaseEnum.FIRST || enumA == BaseEnum.SECOND) {
return 1;
} else {
return 2;
}
}
protected int xxx3() {
System.out.println(BaseEnum.values());
return 2;
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译它时,编译错误出现在 switch 语句中,内容如下xxx():
java: base.Base.BaseEnum.values() is defined in an inaccessible class or interface
简而言之,问题是这里到底发生了什么?为什么values()还叫这里呢?如果真的调用了,为什么访问不到呢?正如您所看到的,我可以正确访问BaseEnum此类及其成员(请参阅xxx2()),甚至values()方法(这是超类内受保护的嵌套枚举的公共方法InnerA,请参阅xxx3())。是否按照此开关位于A类内部的方式计算访问权限?如果是这样,为什么?
这已作为 bugs.openjdk.java.net/browse/JDK-8178701 提出,但据我所知,尚未收到 Java 维护人员的反馈。因此,尚不清楚它是否被视为有效的错误。