Java enum
设施提供的语法糖有时会有点混乱.考虑这个不编译的例子:
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()
):"找不到符号助手()".(虽然有一些奇怪的事情发生了:在尝试使用不同的Java版本后,我无法this.helper()
再使用它们中的任何一个进行编译......)
错误消息具有误导性,只需helper
保护它就可以了.
protected void helper(){ // can be called from subclasses (such as FOO) since it is not private }