我遇到一个奇怪的问题,我不确定它是编译器问题还是我对带接口的枚举的理解。我正在使用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
我之前已经完成了这个(由界面定义的行为的枚举)没有问题。有什么想法吗?
答案 0 :(得分:8)
您需要在isActionable()
本身中实施MyEnum
方法。因为isActionable()
和ACIONABLE
中定义的方法NOT_ACTIONABLE
是他们的本地方法。因此,您需要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;}
}
答案 1 :(得分:3)
你可以试试这个替代方案:
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;
}
}
答案 2 :(得分:2)
这看起来像一个javac bug。 javac在JDK7中编译得很好。它不在JDK6(javac 1.6.0_24)中,来自IntelliJ和命令行。
答案 3 :(得分:1)
似乎javac for 1.6需要对接口方法进行全局覆盖,而后来的版本则不需要,Eclipse编译器也不需要。
似乎只是 IntelliJ
的一个错误。我将编译器设置从javac
更改为Eclipse
,然后再更改为javac
,并按预期编译并运行。
虚警。 :)
答案 4 :(得分:1)
有些人已经完美地回答了这个问题,我只想再添加一个小提示:你也可以在界面中保留方法摘要:
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();
}