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

时间:2017-10-13 16:17:07

标签: java generics

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构造函数指定完整的垃圾!

此外,如果我只进行一次更改,相同的代码行为会有所不同 - 使该类不是通用的

  1. 构造函数见证中的错误数量的类型参数现在给出 编译错误!
  2. 错误类型的参数(不匹配真实参数) 构造函数见证现在也给出了编译错误!
  3. 但输出仍然相同:

    java.lang.Double
    java.lang.Double
    

    如果 类是通用的,但是创建了类型new <String>My<Byte, Byte>(1.1);),那么一切都与上面完全相同:

    1. 构造函数见证中的错误数量的类型参数现在给出 编译错误!
    2. 错误类型的参数(不匹配真实参数) 构造函数见证现在也给出了编译错误!
    3. 同样,输出仍然相同:

      java.lang.Double
      java.lang.Double
      

      answer接近主题,但不清楚直接回答此处的问题。

0 个答案:

没有答案