2

Enum1とEnum2の2つの列挙型クラスがあります。

enum Enum1 {ONE, TWO, THREE}
enum Enum2 {FOUR, FIVE}

そして私はこのような方法を持っています:

public <E extends Enum<E>> method (E arg) {
    switch (arg) {    // Here is the compile error -- Cannot switch
                      // on a value of type E. Only convertible int
                      // values, strings or enum variables are permitted

                      // (And of course, all the cases are incorrect
                      // because the enum set is unknown)
        case ONE:
            // do something
        case TWO:
            // do something
        case THREE:
            // do something
        case FOUR:
            // do something
        case FIVE:
            // do something
        default:
            // do something
    }
}

では、ジェネリック列挙型の値を切り替えることは可能ですか?


文字列に変更する方法が1つあります(JDK7でのみ機能します)。

public <E extends Enum<E>> method (E arg) {
    switch (arg.name()) {
        case "ONE":
            // do something
        case "TWO":
            // do something
        case "THREE":
            // do something
        case "FOUR":
            // do something
        case "FIVE":
            // do something
        default:
            // do something
    }
}
4

3 に答える 3

5

あなたがしようとしていることをすることはできません。1 つには、enumスイッチは実際にordinal()は、列挙型のスイッチの省略形です。そのため、スイッチに「joint enum」タイプを認識させることができたとしても、ステートメントには重複したcase分岐があります。(たとえば、ONEどちらFOURも序数が 0 です。)

1 つのアプローチは、アクションを列挙自体に移動することです。次に、各enumタイプに共通のインターフェースを実装させることができます。

interface Actor {
    void doSomething();
}

enum Enum1 implements Actor {
    ONE {
        public void doSomething() { . . . }
    },
    TWO {
        public void doSomething() { . . . }
    },
    THREE {
        public void doSomething() { . . . }
    }
}

enum Enum2 implements Actor {
    FOUR {
        public void doSomething() { . . . }
    },
    FIVE {
        public void doSomething() { . . . }
    }
}

次に、メソッドを実装して、処理をアクターに委任するだけです。

public void method(Actor actor) {
    if (actor == null) {
         // default action
    } else {
        actor.doSomething();
    }
}
于 2012-12-19T18:50:15.427 に答える
2

switch ステートメントの前に列挙型を特定の型にキャストする必要があります (したがって、型ごとに個別の switch ステートメントが必要です)。つまり、これは最善のアイデアではありません。これを行う必要がないようにコードをリファクタリングすることで、より良い解決策が見つかる可能性があります。

于 2012-12-19T18:35:59.903 に答える