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自体を実装する必要があります。とのisActionable()内部で定義されたメソッドは、それらに対してローカルであるためです。そのため、 のグローバル メソッドが必要です。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 で問題なくコンパイルします。IntelliJとコマンドラインの両方から、JDK6(javac 1.6.0_24)にはありません。

于 2013-01-28T20:54:23.027 に答える
1

1.6 の javac ではインターフェイス メソッドのグローバル オーバーライドが必要なようですが、それ以降のバージョンではそうではなく、Eclipse コンパイラでもそうではありません。

のバグだったようIntelliJです。コンパイラの設定を から に変更してからjavacEclipse戻し、javac期待どおりにコンパイルして実行します。

誤警報。:)

于 2013-01-28T20:45:40.643 に答える