作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
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)
}
}
谁能解释为什么编译器说
Non-static method 'helper()' cannot be referenced from a static context
这个上下文究竟是静态的吗?
您可以通过更改对 this.
helper()
的调用来进行编译(这里有一个令人困惑的地方:如果我们真的是在编译器建议的“静态上下文”中,“this
”如何工作?)或通过将 helper()
的可见性提高到默认级别。你更喜欢哪个?另外,请随时提出更好的问题标题:-)
编辑:我找到了some discussion about this - 但没有真正的答案。我的同事认为 this.helper()
起作用的事实实际上是一个编译器错误。事实上,对于较新的 Java 版本,它似乎不 起作用(尽管 super.helper()
起作用):“找不到符号 helper()”。 (尽管发生了一些奇怪的事情:尝试使用不同的 Java 版本后,我无法让 this.helper()
再次编译它们中的任何一个...)
最佳答案
该错误消息具有误导性,只需将 helper
设为 protected 即可。
protected void helper(){
// can be called from subclasses (such as FOO) since it is not private
}
关于java - 枚举定义中的静态上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/581450/
我是一名优秀的程序员,十分优秀!