据我所知,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)中,毕竟没有被丢弃,但它应该被丢弃。我有什么误解?