带接口的枚举类成员无法在内部找到方法

我有一个奇怪的问题,我不确定它是编译器问题还是我对带接口的枚举的理解。 我正在使用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()方法。 因为在ACIONABLENOT_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(); }