このリンクには次のように記載されています。
実際の型引数を持つジェネリック型のインスタンス化は、パラメーター化された型と呼ばれます。例 (パラメーター化された型):
Collection<String> coll = new LinkedList<String>();
では、パラメータ化された型とは何ですか?
Collection<String>
またLinkedList<String>
どちらもパラメーター化された型 (他の型をパラメーターとして受け取る型) です。
式の両側に異なる型があるという事実は無関係であり、ポリモーフィックな動作に関係しています。つまり、LinkedList
は のサブタイプであるためですCollection
。
パラメーター化された型は、一般に、型が何であるかに興味を持たずに他のオブジェクトを処理するクラスです。タイプは、シンボリックな「名前」を使用して定義され、クラスのインスタンスが作成されるときに渡されます。
例えば:
class MyClass<T> {
private T obj;
public MyClass<T>(T obj) {
this.obj = obj;
}
public int getId() {
return obj.hashCode();
}
}
上記の例MyClass
では、任意のタイプのオブジェクトをラップhashCode()
し、このメソッドが常に存在するという事実を使用してそのメソッドを実行します。
このクラスの使用方法は次のとおりです。
int sid = new MyClass<String>("aaaa").hashCode();
あなたが言うことができないことに注意してください new MyClass<String>(123)
:オブジェクトがパラメーターで作成されるという事実はString
、コンストラクター引数のタイプを決定します。
あなたの例に戻ると、Collection<String>
「文字列のコレクション」を意味します。これは、このコレクションに他のタイプのオブジェクトを追加できないことを意味します。
ジェネリック型とパラメーター化された型は同義のようです。しかし、ジェネリックという言葉の意味ではもはやジェネリックではないため、たとえばBox<Integer>
ジェネリック型と呼ぶのは正しくないようです。だからおそらく:
ジェネリック型は、正式な型パラメーターを使用した宣言です。
class Box<T> { .. }
Box<T>
ジェネリック型です
パラメータ化された型は、実際の型引数を持つ宣言です。
Box<Integer> b;
Box<Integer>
パラメータ化された型です
生の型は、実際の型引数を持たないジェネリック型の宣言です。
class Box<T> { .. }
Box b;
Box
生タイプです
コレクションの両方の用途
Collection<String>
LinkedList<String>
ここではパラメータ化String
された型であり、使用される型です。
ParameterizedType は、Collection などのパラメーター化された型を表します。
パラメーター化された型は、このパッケージで指定されているように、リフレクション メソッドによって初めて必要になったときに作成されます。パラメーター化された型 p が作成されると、p がインスタンス化するジェネリック型宣言が解決され、p のすべての型引数が再帰的に作成されます。型変数の作成プロセスの詳細については、TypeVariable を参照してください。パラメータ化された型を繰り返し作成しても効果はありません。
このインターフェイスを実装するクラスのインスタンスは、同じジェネリック型宣言を共有し、等しい型パラメーターを持つ任意の 2 つのインスタンスを同等にする equals() メソッドを実装する必要があります。