型パラメーターと型引数には違いがあります。ワイルドカード (super
およびextends
) の使用は、型引数用です。つまり、型パラメーターの対応する値を実際に定義するときに、呼び出しサイトでそれらを宣言します。または、キーワードextends
を型パラメーターの制約に使用できます。
型パラメーターと型引数
そのため、定義class List<T>{}
でT
は、 は型パラメーターと呼ばれます。type の参照を宣言する場合List
、呼び出しサイトで の型引数を指定T
できます。これは、不変条件 (つまりList<String> jedis
) または super または extends を使用したワイルドカード (つまりList<? extends Number> myNums
, List<? super String> names
) にすることができます。
型パラメータの制約
キーワードextends
は、特定の型パラメーターの制約を宣言するために、まったく異なる目的で使用することもできます。たとえば、宣言は次のとおりです。
class List<T extends CharSequence>{}
型パラメーターT
は制約されています。これは、型パラメーターの型引数を宣言するときはいつでも、型またはそのサブタイプのいずれかT
でなければならないことを意味します。CharSequence
それ自体List<String>
は有効な宣言ですが、そうでList<Integer>
はありません。
キーワードの使用は、super
型パラメーター制約の宣言では許可されていません。おそらく、宣言ではあまり意味がないためです。それ自体T
ではないための有効な型引数は何でしょうか?A