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)
}
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释为什么编译器说
无法从静态上下文引用非静态方法'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
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3325 次 |
最近记录: |