可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I'm having a strange issue which I'm not sure if it's a compiler problem or my understanding of enums with interfaces. I'm using IntelliJ IDEA 12, building an Android project, and I have a class like this:
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(); } }
Now, this was working initially, but now the compiler is complaining (and I've tried this in a brand new project as well with the same results) with the error:
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
I've done this before (enumerations with behaviors defined by an interface) with no issues. Any thoughts?
回答1:
You need to implement isActionable() method in MyEnum itself. Because the method isActionable() defined inside the ACIONABLE and NOT_ACTIONABLE are local to them . So you need the global method for the MyEnum enum .
use this code instead:
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;} }
回答2:
You could try this alternative:
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; } }
回答3:
That looks like a javac bug. javac compiles it fine in JDK7. It doesn't in JDK6 (javac 1.6.0_24), both from IntelliJ and from the command line.
回答4:
It seems that javac for 1.6 requires a global override for the interface method, whereas later versions do not, nor does the Eclipse compiler.
Seems it was just a bug with IntelliJ. I changed the compiler setting from javac to Eclipse, then back to javac and it compiles and runs as expected.
False alarm. :)
回答5:
Some people already answered this perfectly, I just add one more little tip: you can also keep the method abstract in the interface:
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(); }