Член класса enum с интерфейсом не может найти методы внутри
У меня странная проблема, и я не уверен, что это проблема компилятора или мое понимание перечислений с интерфейсами. Я использую 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
Я сделал это раньше (перечисления с поведением, определенные интерфейсом) без проблем. Любые мысли?
Ответы
Ответ 1
Вам нужно реализовать метод 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;}
}
Ответ 2
Вы можете попробовать эту альтернативу:
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
Это похоже на ошибку javac. javac компилирует его в JDK7. Это не в JDK6 (javac 1.6.0_24), как из IntelliJ, так и из командной строки.
Ответ 4
Кажется, что javac для 1.6 требует глобального переопределения для метода интерфейса, тогда как более поздних версий нет, а также компилятора Eclipse.
Кажется, это была ошибка с IntelliJ
. Я изменил настройку компилятора с javac
на Eclipse
, а затем вернулся к javac
, и он компилируется и работает как ожидалось.
Ложная тревога.:)С >
Ответ 5
Некоторые люди уже полностью ответили на это, я просто добавлю еще один маленький совет: вы также можете сохранить абстрактный метод в интерфейсе:
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();
}