8

MyInterface を実装する列挙型があります。その列挙型を使用して他のクラスを作成しているときに、enumClz を MyInterface を実装したクラスに制限したいと考えています。

T extends Enum< T extends MyInterface>というわけで、ジェネリック型宣言時にシグネチャを " " と記述します。

public <T extends Enum< T extends MyInterface>> C1( Class<T> enumClz) {
    for (T anEnumConst : enumClz.getEnumConstants()) {
        //....process
    }
}

私が驚いたのは、IDE が " " で "unexpected bound" だと言っていることですT extends MyInterface。このような 2 つの単語のエラー メッセージが何を意味するのかわかりません。これに関する解決策はありますか?


ところで、あまり重要ではありませんが、奇妙な質問があります。列挙型 T は、次の無限ループと同等にできますか

<T extends Enum< T extends Enum<T extends<....>>>> ?

4

1 に答える 1

10

代わりに次のように宣言します。

public <T extends Enum<T> & MyInterface> C1(Class<T> enumClz)

ここでは、T複数の上限を持つことを宣言していますが、これは型パラメーターで可能です。

宣言は具体的な型でバインドする必要がある<T extends Enum<T extends MyInterface>>ため無効な構文ですが、型引数のは、既に宣言されている場合に関する情報を追加しようとしています。TT extends MyInterfaceEnumT

複数の境界を宣言するときは、クラス型が常に最初に来なければならないことにも注意してください。の宣言<T extends MyInterface & Enum<T>>も無効な構文です。

ところで、あまり重要ではありませんが、奇妙な質問があります。列挙型Tは次の無限ループと同等にできますか

<T extends Enum< T extends Enum<T extends<....>>>>?

宣言は、再帰的T extends Enum<T>であるという点ですでに「無限」です。宣言されているのと同じものが、その上限の型引数として指定されます。型パラメーターのスコープには、独自の宣言が含まれます。T

詳しくは:

于 2013-10-29T04:14:51.297 に答える