我有这门课:
public class A<T> {
protected T something = new T();
...
}
Run Code Online (Sandbox Code Playgroud)
当然new T()不可能.我该怎么做?
我不能更改调用此类的构造函数的代码,因为这是通过反射完成的.
另一个问题是如何获取泛型类的Class对象.mymethod(A.class)工作,但现在A得到了参数T.
您可以接收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>可以使用除此构造函数之外的其他内容创建新实例.
你可以有一个带Class<T>参数的构造函数(或方法)clazz.newInstance()
每当您实例化对象时,您都知道类型,因此您有:
A<Foo> a = new A<Foo>(Foo.class);
Run Code Online (Sandbox Code Playgroud)