1)为什么new <String, String>My(1.1);
编译?我明确定义了构造函数只有一个类型参数:public <R> My(R arg)
!
2)为什么尽管我在构造函数调用中提供了确切的类型(类型见证)(指定类型参数R是String),new <String, String>My(1.1);
忽略它并且类型为Double(<R>
= Double) ?
3)为什么在运行时可以理解传递给构造函数的参数类型(Double)?构造函数是通用的,因此在运行时,没有类型信息可用,只有对象!?
class My<T,U> {
public <R> My(R arg) {
System.out.println(arg.getClass().getName());
}
}
public class Driver {
public static void main(String[] args) {
new My(1.1); // 1
new <String, String>My(1.1); // 2
}
}
输出:
java.lang.Double
java.lang.Double
P.S。我知道JLS说构造函数(或任何方法)类型见证(es)被忽略,如果构造函数\方法没有被声明为通用,并且对于两种情况都是如此(当类本身是通用的,并且类本身不是通用的)。但在我的例子中,我也可以明确地为 generic \ parametrized构造函数指定完整的垃圾!
此外,如果我只进行一次更改,相同的代码行为会有所不同 - 使该类不是通用的:
但输出仍然相同:
java.lang.Double
java.lang.Double
如果 类是通用的,但是创建了类型(new <String>My<Byte, Byte>(1.1);
),那么一切都与上面完全相同:
同样,输出仍然相同:
java.lang.Double
java.lang.Double
此answer接近主题,但不清楚直接回答此处的问题。