Java 为什么我可以为泛型\参数化构造函数指定垃圾类型参数(类型见证)?

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>

1) 为什么<代码>新车型年款(1.1)编译?我明确定义了构造函数只有一个类型参数:
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。