带接口的枚举类成员无法在内部找到方法
我有一个奇怪的问题,我不确定它是编译器问题还是我对带接口的枚举的理解。 我正在使用IntelliJ IDEA 12,构建一个Android项目,我有一个这样的类:
public class ClassWithEnum { private MyEnum myEnum; //Trying to access it internally here throws the error public boolean isActionable() { return myEnum.isActionable(); } public enum MyEnum implements Action { ACTIONABLE() { @Override public boolean isActionable() { return true; } }, NOT_ACTIONABLE() { @Override public boolean isActionable() { return false; } } } public interface Action { public boolean isActionable(); } }
现在,这是最初的工作,但现在编译器正在抱怨(我在一个全新的项目中尝试了这个以及相同的结果)并且错误:
java: /Users/kcoppock/Documents/Projects/EnumInterfaceTest/src/com/example/EnumInterfaceTest/ClassWithEnum.java:11: cannot find symbol symbol : method isActionable() location: class com.example.EnumInterfaceTest.ClassWithEnum.MyEnum
我之前已经完成了这个(由接口定义的行为的枚举)没有问题。 有什么想法吗?
您需要在MyEnum
本身中实现isActionable()
方法。 因为在ACIONABLE
和NOT_ACTIONABLE
中定义的方法isActionable()
是它们的本地方法。 所以你需要MyEnum
enum
的全局方法。
请改用此代码:
public enum MyEnum implements Action { ACTIONABLE() { @Override public boolean isActionable() { return true; } }, NOT_ACTIONABLE() { @Override public boolean isActionable() { return false; } }; @Override public boolean isActionable() { return false;} }
你可以试试这个替代方案:
public enum MyEnum implements Action { ACTIONABLE(true), NOT_ACTIONABLE(false); private final boolean actionable; MyEnum(boolean actionable) { this.actionable = actionable; } @Override public boolean isActionable() { return this.actionable; } }
这看起来像一个javac bug。 javac在JDK7中编译得很好。 它不在JDK6(javac 1.6.0_24)中,来自IntelliJ和命令行。
似乎javac for 1.6需要接口方法的全局覆盖,而后来的版本则不需要,Eclipse编译器也不需要。
似乎这只是 IntelliJ
一个错误。我将编译器设置从 javac
更改为Eclipse
,然后返回到javac
,它编译并按预期运行。
误报。 🙂
有些人已经完美地回答了这个问题,我再添加一个小提示:你也可以在界面中保持方法的抽象:
public enum MyEnum implements Action { ACTIONABLE() { @Override public boolean isActionable() { return true; } }, NOT_ACTIONABLE() { @Override public boolean isActionable() { return false; } }; @Override abstract public boolean isActionable(); }