据我所知,Java在运行时删除泛型类型参数信息.它仅用于编译以执行检查,例如,此特定方法调用是否有效.
今天我遇到了下面这段代码,其中,看似Java,由collection/list类型参数决定,要调用哪个构造函数:
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");
}
}
Run Code Online (Sandbox Code Playgroud)
进行以下调用:
new MyClass(new HashSet<String>()); // Constructor 1
new MyClass(new ArrayList<String>()); // Constructor 1
new MyClass(new ArrayList<Integer>()); // Constructor 2
Run Code Online (Sandbox Code Playgroud)
现在,如果我删除类型参数:
public static class MyClass2 {
public MyClass2(final Collection coll) {
System.out.println("Constructor 1");
}
public MyClass2(final List list) {
System.out.println("Constructor 2");
}
}
Run Code Online (Sandbox Code Playgroud)
......同样的电话就像我期望的那样; 使用list参数的构造函数调用适用于"最精确地"满足其需求的构造函数:
new MyClass2(new HashSet<String>()); // Constructor 1
new MyClass2(new ArrayList<String>()); // Constructor 2 …Run Code Online (Sandbox Code Playgroud)