Член класса 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();
}