Java 实例化泛型类

Java 实例化泛型类,java,generics,compiler-errors,instance,Java,Generics,Compiler Errors,Instance,代码: class-MyClass{ 公开作废法(){ 新建ArrayList();//好的-为什么? } } 为什么在这种情况下我们没有编译错误。类型T与编译时的特定类型不匹配。创建MyClass的实例时,必须提供类型T。因此,当调用method时,类型T将绑定到在MyClass的构造中定义的任何类型T,当您创建MyClass的实例时,必须提供类型T。因此,当调用方法时,T类型将绑定到在MyClass的构造中定义的T类型,而不是T。 Javac可以知道ArrayList有一个默认构造函数,在

代码:

class-MyClass{
公开作废法(){
新建ArrayList();//好的-为什么?
}
}

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

创建
MyClass
的实例时,必须提供类型
T
。因此,当调用
method
时,类型
T
将绑定到在
MyClass
的构造中定义的任何类型
T
,当您创建
MyClass
的实例时,必须提供类型
T
。因此,当调用
方法时,
T
类型将绑定到在
MyClass
的构造中定义的
T
类型,而不是
T

Javac可以知道
ArrayList
有一个默认构造函数,在编译时没有参数,因此没有问题。

您正在实例化
ArrayList
,而不是
T

Javac可以知道,
ArrayList
有一个默认构造函数,在编译时没有参数,因此没有问题。

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


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

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


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

请通过请通过感谢!!!但若我试图将静态修饰符添加到
方法
中,我就出现了编译错误。为什么会发生?因为T是在创建实例时定义的。静态方法没有实例存在。谢谢!!!但若我试图将静态修饰符添加到
方法
中,我就出现了编译错误。为什么会发生?因为T是在创建实例时定义的。静态方法不存在实例。
class MyClass<T>{
    public void method(){
        new ArrayList<T>();//OK- Why?
    }
}