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

时间:2013-01-28 20:35:28

标签: java interface enums

我遇到一个奇怪的问题,我不确定它是编译器问题还是我对带接口的枚举的理解。我正在使用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

我之前已经完成了这个(由界面定义的行为的枚举)没有问题。有什么想法吗?

5 个答案:

答案 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();
}