someenumt .values()在切换enum时定义在不可访问的类或接口中



让我们考虑基类:

package base;
public abstract class Base {
protected enum BaseEnum {
FIRST, SECOND, THIRD
}
}

及其子类:

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;
}
}
}

当我试图编译它时,xxx()中的switch语句出现编译错误:

java: base.Base.BaseEnum.values() is defined in an inaccessible class or interface

简单地说,问题是这里到底发生了什么?为什么这里叫values()?如果它真的被调用,为什么它是不可访问的?正如您所看到的,我可以从这个类(参见xxx2())甚至values()方法(这是InnerA超类中受保护的嵌套枚举的公共方法,参见xxx3())正确访问BaseEnum及其成员。访问是计算,如果这个开关将在A类?如果是,为什么?

这已经作为一个bug bugs.openjdk.java.net/browse/JDK-8178701被提出,但据我所知,还没有从Java维护者那里得到反馈。因此,目前还不清楚它是否被认为是一个有效的bug。

可能的解决方案:

我发现的第一个解决方案是A必须从Base扩展,而不是从InnerA扩展。所以你可以在你的内部类InnerA中访问受保护的BaseEnum。

第二个解决方案是简单地将BaseEnum设为public。

为什么会这样?

switch语句是问题所在,正如你在问题中所假定的那样。但是我既没有线索也没有发现为什么switch语句在这个星座中通过受保护的enum进行切换会出现问题。

最新更新