Javaenum
工具提供的语法糖有时会有点混乱。考虑这个不编译的例子:
public enum TestEnum {
FOO("foo") {
public void foo() {
helper(); // <- compiler error
}
};
String name;
TestEnum(String name) {
this.name = name;
}
public abstract void foo();
private void helper(){
// do stuff (using this.name, so must not be static)
}
}
谁能解释为什么编译器说
不能从静态上下文中引用非静态方法“helper()”
这个上下文究竟是如何静态的?
您可以通过将调用更改为(这是一个令人困惑的点:如果我们真的像编译器建议的那样处于“静态上下文”中,“ ”如何工作?)或通过将可见性提高到默认级别来进行编译。你更喜欢哪个?另外,请随时提出更好的问题标题:-)this.
helper()
this
helper()
编辑:我发现了一些关于这个的讨论- 但没有真正的答案。我的同事认为这实际上this.helper()
是一个编译器错误。实际上,对于较新的 Java 版本,它似乎不起作用(尽管super.helper()
确实如此):“找不到符号 helper()”。(尽管发生了一些奇怪的事情:在尝试了不同的 Java 版本之后,我无法this.helper()
再次使用它们中的任何一个进行编译......)