Java 实例化泛型类型
我的代码是:Java 实例化泛型类型,java,generics,instantiation,Java,Generics,Instantiation,我的代码是: public class MyClass<T extends MyComponent> { private T t; public MyClass(){ t = new T(); } } 公共类MyClass{ 私人T; 公共MyClass(){ t=新的t(); } } 但是编译器不接受新的t()。有没有一种方法可以在不带参数的情况下使用构造函数MyClass()实现这一点?由于类型擦除,JVM不知道什么是t,因此无法实例化
public class MyClass<T extends MyComponent> {
private T t;
public MyClass(){
t = new T();
}
}
公共类MyClass{
私人T;
公共MyClass(){
t=新的t();
}
}
但是编译器不接受新的t()。有没有一种方法可以在不带参数的情况下使用构造函数MyClass()实现这一点?由于类型擦除,JVM不知道什么是
t
,因此无法实例化它。解决方法是提供一个类
,并使用它创建一个新实例:
public MyClass(Class<T> clazz)
{
t = clazz.newInstance();
}
public MyClass(Class clazz)
{
t=clazz.newInstance();
}
您必须添加捕获IllegalAccessException
和实例化exception
您可以执行的操作
public class MyClass<T extends MyComponent> {
private T t;
MyClass(Class<T> clazz) throws InstantiationException,
IllegalAccessException {
t = clazz.newInstance();
}
}
公共类MyClass{
私人T;
MyClass(Class clazz)抛出实例化异常,
非法访问例外{
t=clazz.newInstance();
}
}
不能不访问T的类对象。想想看,T可以是MyComponent的任何子类,您甚至如何决定在该特定子类上可用的构造函数
类型擦除意味着编译器用MyComponent悄悄地替换对T的所有“实”引用
如果您有类的引用,可以调用
Class#newInstance
,或者获取一个构造函数并调用它。在构造函数中指定T
作为参数。如果您的T类没有空构造函数,会发生什么?我的T类有一个空构造函数而没有参数是无法完成的。习惯它。