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类有一个空构造函数而没有参数是无法完成的。习惯它。