Java 为什么我可以为泛型\参数化构造函数指定垃圾类型参数(类型见证)?
1) 为什么<代码>新车型年款(1.1)代码>编译?我明确定义了构造函数只有一个类型参数:Java 为什么我可以为泛型\参数化构造函数指定垃圾类型参数(类型见证)?,java,generics,Java,Generics,1) 为什么新车型年款(1.1)编译?我明确定义了构造函数只有一个类型参数:public My(R arg) 2) 为什么尽管我在构造函数调用中提供了确切的类型(类型见证)(指定类型参数R为String),newmy(1.1)忽略它,并且类型为Double(=Double) 3) 为什么在运行时可以理解传递给构造函数的参数(Double)的类型?构造函数是泛型的,所以在运行时没有可用的类型信息,只有Object class My<T,U> { public <R>
public My(R arg)
2) 为什么尽管我在构造函数调用中提供了确切的类型(类型见证)(指定类型参数R为String),newmy(1.1)
忽略它,并且类型为Double(
=Double)
3) 为什么在运行时可以理解传递给构造函数的参数(Double)的类型?构造函数是泛型的,所以在运行时没有可用的类型信息,只有Object
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
}
}
另外,我知道JLS说,如果构造函数\方法未声明为泛型,则忽略构造函数(或任何方法)的类型见证,这两种情况都是如此(当类本身为泛型,而类本身为非泛型时)。但在我的示例中,我也可以显式地将完全垃圾指定给泛型\参数化构造函数
此外,如果我只做一个更改,相同的代码的行为会有所不同-使类不是泛型的:
java.lang.Double
java.lang.Double
java.lang.Double
java.lang.Double
如果类是泛型的,但创建时指定了类型(newmy(1.1);
),则一切都与上面的一样:
java.lang.Double
java.lang.Double
java.lang.Double
java.lang.Double
这与主题很接近,但对这里的问题没有明确而直接的答案。您的类实例创建表达式适用于原始类型
My
。所有泛型都被忽略。去掉类类型参数T
和U
,编译将失败,例如2。第3点:代码将Double
传递到构造函数中,然后打印出该对象的类。您传入的对象不会因为泛型而丢失其类型。如果您在命令行上编译,请使用-Xlint
选项。如果使用IDE,请启用所有编译器警告。无论哪种方式,这都会向您展示编译器对您的调用的真实想法。哇。我知道这是一个原始类型的东西,但即使使用原始类型,我也不会期望它在一个构造函数上允许2个类型参数,而这个构造函数需要1。