我希望有人解释此文件导致的编译错误:
public enum TestEnum {
A {
@Override
void someMethod() {
System.out.println("A: " + x);
}
},
B {
@Override
void someMethod() {
System.out.println("B: " + x);
}
};
private int x;
abstract void someMethod();
}
编译错误是:
TestEnum.java:11: error: non-static variable x cannot be referenced from a static context
System.out.println("B: " + x);
如果我删除private
修饰符,则该类编译时没有错误。这似乎意味着someMethod
是一个静态上下文(是吗?)并且删除int x
上的访问修饰符使它成为一个静态变量(是吗?)。为什么会这样?
环境:
P.S。我正在尝试初始化枚举构造函数中的Properties
字段,该字段委托给每个枚举实例的抽象init
方法。这就是我遇到上述错误消息的地方。我不希望x/properties
成为静态字段;它应该对每个枚举实例都是唯一的。
How to use fields in java enum by overriding the method?
首先,如果你不介意向某个机构提出上诉,Jon Skeet会对这个问题发表评论,说“这很奇怪 - 我很惊讶覆盖算作静态上下文。”受保护的字段会删除错误,这也是奇怪的......“
据Rafael's excellent answer所述,他从未解决过这种奇怪的问题。是的,A
和B
等同于静态嵌套类,但静态内部类大致相当于普通的顶级类:它并不意味着所有的方法和字段都是class也是静态的。枚举的方法是静态上下文吗?那么在Rafael的回答中,doIt
方法实际上是静态方法,即使它们没有被标记为?
答案 0 :(得分:1)
试试这个
((TestEnum)this).x
错误消息具有误导性。问题是,private
字段未被继承,因此x
或this.x
无法编译。您必须将其上传到超类才能访问它。
另见https://groups.google.com/d/msg/java-lang-fans/KVmmgeSCHkA/Kr_KxaaeolIJ
受保护的'这里访问可能更好
protected int x;