2
当嵌套枚举类试图访问外部时,它会收到有关无法访问静态上下文中的非静态字段的错误消息。但是,将字段包置于本地,或者使用超级关键字“修复”问题,这在错误消息中并不明显。嵌套枚举不能访问枚举类的私有字段
如果枚举是一个嵌套类,那就没有三人
public enum EnumExample {
One {
public int getMemberVariableFailes() {
// error: non-static variable memberVariable cannot be referenced from a static context
return memberVariable;
}
public int getMemberVariableOK() {
return super.memberVariable;
}
public int getMemberVariable2OK() {
return memberVariable2;
}
};
private final int memberVariable = 1;
final int memberVariable2 = 1;
}
预期 -
的错误消息不说清楚,采用了超。关键字会“解决”问题。它看起来不是正确的行为,但如果是错误信息,则不会提供解决方案。
实际 - 与下面相同的行为。
However following compiles absolutely fine.
public class Enumtest {
public class NestedNotEnum extends Enumtest {
public int getMemberVariableFailes() {
// compiles just fine.
return memberVariable;
}
public int getMemberVariableOK() {
return super.memberVariable;
}
}
private final int memberVariable = 1;
}
可有一个阐述为什么发生这种情况。
如果两个EnumExample的子类的一个实例,和静态嵌套类EnumExample的。该字段在超类中定义,并应可供子类访问。因此它应该被保护而不是私人的。 –
@JBNizet,你是对的,但恕我直言,错误信息的文本是有点混乱。 '一个'确实是静态成员和'EnumExample'的一个子类。作为一个子类,它不应该能够访问super的私有成员。但是,如果明确写出“超级”字,就可以。恕我直言,这是奇怪的... – AlexR
是的,这也是我的担忧...文本消息是相当混乱,我运行它在Linux和solaris上都和Java 6和Java 7,但得到了相同的答案... :( –