3

動機: いくつかの値のファミリーのすべての可能な値を表す列挙型を作成したいと思います (ここで「クラス」と言うのを躊躇します)。列挙型には、追加のメソッド、フィールドがあり、おそらく他のインターフェイスを実装することさえあります。次に、この列挙型を別のメソッドに渡したいと思います。そこで、可能なすべての値を反復処理します (使用Enum.values()していくつかの作業を行います.

調査したところ、enumFooが実際に になることがわかりましたFoo extends Enum<Foo>。これが列挙型を拡張できない理由です。メソッドの引数を次のように定義しようとしました。

myMethod(Class<?> bar) {...}
myMethod(Class<? extends Enum> bar) {...}
myMethod(Class<? extends Enum<?>> bar) {...}

しかし、メソッド内で次のような基本的なことを試してみると:

int i = bar.values().length;

それは失敗します。これを行う(またはこれを行う必要を回避する)他の方法はありますか?

注: 列挙型の実際のインスタンスを渡して、bar.getDeclaringClass()(インスタンスではなく) 列挙型クラスを見つけるために使用することもできますが、これはかなり醜いです。

4

1 に答える 1

11

以下を使用してみてください。

<E extends Enum<E>> void myMethod(Class<E> enumType) {
    E[] values = enumType.getEnumConstants();
    ...
}

getEnumConstants()ドキュメントから:

この列挙型クラスの要素を返すか、この Class オブジェクトが列挙型を表していない場合は null を返します。

編集:共有インターフェイスを実装するさまざまな列挙型を使用している場合は、インターフェイス メソッドを呼び出せるようにメソッドを変更できます。例えば:

interface Fooable {
    void foo();
}

...

<E extends Enum<E> & Fooable> void myMethod(Class<E> enumType) {
    E[] values = enumType.getEnumConstants();
    for (E value : values) {
        value.foo();
    }
}
于 2012-10-31T02:43:14.657 に答える