Java 使用泛型类型参数确定要调用哪个方法?
据我所知,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)中,并且毕竟没有被丢弃,但应该被丢弃。我误解了什么?