EnumMap は次のように定義されます。
Class EnumMap<K extends Enum<K>,V>
"K extends Enum<K>" とはどういう意味ですか?
たとえば、これを理解できます。
K extends Number
この場合、K は Number を拡張する任意のタイプのオブジェクトです。たとえば、整数。
しかし、どういうK extends Enum<K>
意味ですか?
K extends Enum<K>
最初の型パラメーターがそれ自体でK
ある のサブタイプにのみバインドできる型パラメーターを導入します。Enum
これは自己参照であり、同じことが java.lang.Enum でも繰り返されます。これは、汎用化されたメソッドが正しくキャストされるようにするためです。 java.lang.Enum.valueOf(Class, String)の定義を参照してください。
同様の使用法の (長い場合) 良い例は、AbstractBuilder を定義するこの記事です。
自己参照ジェネリックへの別のリンク(C# の例ですが、ポイントは同じです)
Enum クラスは次のように定義されます。
class Enum<E extends Enum<E>>
これは、ジェネリック型がそれ自体であり、Enum であるクラスであることを意味します。これは、Java 構文で表現される方法にすぎません。
JDK には、似たような例がたくさんあります。
<T extends Comparable<T>>
すべての列挙型のスーパークラスはEnum<K>
であり、一般的な引数は の型ですEnum<K>
。基本的に、これはK
列挙型であることを確認するために使用されています。