gpt4 book ai didi

java - 枚举定义中的静态上下文

转载 作者:搜寻专家 更新时间:2023-10-30 21:26:20 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com