0

代码:

class MyClass<T>{
    public void method(){
        new ArrayList<T>();//OK- Why?
    }
}

为什么在这种情况下我们没有编译错误。类型T在编译时与特定类型不匹配。

4

3 回答 3

3

当您创建 的实例时MyClass,您必须提供类型T。因此,当 call 时method, typeT将绑定到T构造中定义的任何类型MyClass

于 2013-09-28T19:24:59.513 回答
1

从技术上讲,Java 编译器不需要知道 T 的确切类型来生成代码。它在称为擦除的过程中将所有泛型类型转换为 Object。

当然,在编译时它会检查程序是否“类型正确”。在这种情况下是这样,因为 T 只是在构造类时赋予类的参数。因此,当您调用new ArrayList<T>类型时ArrayList<T>,因为类型 T 被定义,所以它被认为是已知的。

于 2013-09-28T19:26:02.580 回答
0

您正在实例化一个ArrayList,而不是一个T. Javac在编译时可以知道ArrayList有一个没有参数的默认构造函数,所以没有问题。

于 2013-09-28T19:25:15.707 回答