我希望有人解释一下这个文件导致的编译错误:
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
上的访问修饰符使其成为一个静态变量(是吗?)。为什么会这样呢?
- java版本"1.8.0_51"
注。我试图初始化枚举构造函数中的Properties
字段,它委托给每个枚举实例的抽象init
方法。这就是我遇到上述错误消息的地方。我不希望x/properties
是一个静态字段;对于每个枚举实例,它应该是唯一的。
复制相反的
如何使用字段在java enum覆盖的方法?
首先,如果你不介意向权威机构求助,Jon Skeet对这个问题的评论是:"这很奇怪——我很惊讶重写被视为静态上下文。"注意,将字段设置为protected会删除错误,这也是奇怪的…"
据我所知,在拉斐尔的精彩回答中,他从来没有提到过这个奇怪的事情。是的,A
和B
相当于静态嵌套类,但静态内部类大致相当于普通的顶级类:这并不意味着类的所有方法和字段都是静态的。枚举的方法在静态上下文中吗?所以在拉斐尔的回答中,doIt
方法实际上是静态方法,即使它们没有这样标记?
试试这个
((TestEnum)this).x
错误信息是误导。问题是,private
字段不被继承,因此x
或this.x
将无法编译。你必须将它向上强制转换到父类才能访问它。
参见https://groups.google.com/d/msg/java-lang-fans/KVmmgeSCHkA/Kr_KxaaeolIJ
这里的"protected"访问可能更好
protected int x;