如何创建泛型类型的新对象?

yoo*_*shi 3 java generics

我有这门课:

public class A<T> {
   protected T something = new T();
   ...
}
Run Code Online (Sandbox Code Playgroud)

当然new T()不可能.我该怎么做?

我不能更改调用此类的构造函数的代码,因为这是通过反射完成的.

另一个问题是如何获取泛型类的Class对象.mymethod(A.class)工作,但现在A得到了参数T.

JB *_*zet 9

您可以接收T作为构造函数的参数:

protected T something;

public A(T something) {
    this.something = something;
}
Run Code Online (Sandbox Code Playgroud)

或者,如果A的目标是真正创建新的T实例,那么将T的工厂作为参数:

protected T something;

public A(Factory<T> somethingFactory) {
    this.something = somethingFactory.newInstance();
}
Run Code Online (Sandbox Code Playgroud)

Class<T>可以被视为一个Factory<T>,因为它有一个newInstance()方法,它调用public no-arg构造函数.但是,Factory<T>可以使用除此构造函数之外的其他内容创建新实例.


Boz*_*zho 7

你可以有一个带Class<T>参数的构造函数(或方法)clazz.newInstance()

每当您实例化对象时,您都知道类型,因此您有:

A<Foo> a = new A<Foo>(Foo.class);
Run Code Online (Sandbox Code Playgroud)

  • @yoooshi你不能改变不编译的代码吗? (2认同)