10

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

我以前做过这个(由接口定义的行为的枚举)没有问题。有什么想法吗?

4

5 回答 5

8

您需要自己实现isActionable()方法MyEnum。因为在andisActionable()里面定义的方法对他们来说是本地的。所以你需要全局方法。ACIONABLENOT_ACTIONABLEMyEnum 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;}
    }
于 2013-01-28T20:47:50.733 回答
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; 
        }
    }
于 2013-01-28T20:45:48.607 回答
2

这看起来像一个 javac 错误。javac 在 JDK7 中可以很好地编译它。它不在 JDK6 (javac 1.6.0_24) 中,来自 IntelliJ 和命令行。

于 2013-01-28T20:54:23.027 回答
1

似乎 1.6 的 javac 需要对接口方法进行全局覆盖,而更高版本不需要,Eclipse 编译器也不需要。

似乎这只是一个错误IntelliJ。我将编译器设置从 更改javacEclipse,然后返回javac,它按预期编译和运行。

虚惊。:)

于 2013-01-28T20:45:40.643 回答
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();
}
于 2014-06-24T11:34:40.813 回答