当嵌套的枚举类尝试访问外部时,它会收到有关无法访问静态上下文中的非静态字段的错误消息。但是,使字段包本地化,或使用super关键字“修复”问题,这在错误消息中并不明显。
如果枚举是一个嵌套类,它将没有三重奏
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;
}
预期 -
错误消息并未明确表示使用super。关键字会“修复”问题。它似乎不是正确的行为,但如果是错误消息则没有给出关于解决方案的指示。
实际 - 与以下内容相同。
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;
}
有人可以详细说明为什么会这样。
答案 0 :(得分:0)
嗯,声明的enum
和提供的内部类示例之间存在差异。您应该将枚举视为“静态嵌套类”和不是“内部类”。现在,提供的类示例转换为:
public class Enumtest
{
static class NestedNotEnum extends Enumtest {
public int getMemberVariableFailes() {
// error: non-static variable memberVariable cannot be referenced from a static context
return memberVariable;
}
public int getMemberVariableOK() {
return super.memberVariable;
}
}
private final int memberVariable = 1;
}
这些结果不符合您的期望吗?与EnumExample
相同,请使用关键字super来解决问题。但是,这仍然很奇怪:
无法对非静态字段memberVariable
进行静态引用
因为我们仍然可以使用super
!