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?
}
}