私の知る限り、Java は実行時にジェネリック型引数情報を削除します。コンパイル時にチェックを実行するためにのみ使用されます。たとえば、この特定のメソッド呼び出しが有効かどうかなどです。
今日、私は次のコードに出くわしました。このコードでは、Java がコレクション/リスト型の引数によって、どのコンストラクターを呼び出すかを決定しているようです。
public static class MyClass {
public MyClass(final Collection<String> coll) {
System.out.println("Constructor 1");
}
public MyClass(final List<Integer> list) {
System.out.println("Constructor 2");
}
}
次の呼び出しが行われます。
new MyClass(new HashSet<String>()); // Constructor 1
new MyClass(new ArrayList<String>()); // Constructor 1
new MyClass(new ArrayList<Integer>()); // Constructor 2
ここで、型引数を消去すると:
public static class MyClass2 {
public MyClass2(final Collection coll) {
System.out.println("Constructor 1");
}
public MyClass2(final List list) {
System.out.println("Constructor 2");
}
}
...同じ呼び出しが期待どおりに機能します。リスト引数を使用するコンストラクター呼び出しは、そのニーズを「最も正確に」満たすコンストラクターを対象としています。
new MyClass2(new HashSet<String>()); // Constructor 1
new MyClass2(new ArrayList<String>()); // Constructor 2
new MyClass2(new ArrayList<Integer>()); // Constructor 2
コンパイルされたクラス (この場合は MyClass) にジェネリック情報が格納されており、結局破棄されていないように見えますが、破棄する必要があります。私は何を誤解していますか?