我上过这堂课:
public class A<T> {
protected T something = new T();
...
}
当然new T()
是不可能的。我该怎么做呢?
我不能更改调用此类构造函数的代码,因为这是通过反射完成的。
另一个问题是如何获取泛型类的Class对象。 mymethod(A.class)工作,但现在A得到参数T。
答案 0 :(得分:9)
您可以接收T作为构造函数的参数:
protected T something;
public A(T something) {
this.something = something;
}
或者,如果A的目标是真正创建新的T实例,那么将T的工厂作为参数:
protected T something;
public A(Factory<T> somethingFactory) {
this.something = somethingFactory.newInstance();
}
Class<T>
可以被视为Factory<T>
,因为它有一个newInstance()
方法,可以调用公共的无参数构造函数。但是Factory<T>
可以使用除此构造函数之外的其他内容创建新实例。
答案 1 :(得分:7)
您可以拥有一个带Class<T>
参数且clazz.newInstance()
每当您实例化对象时,您就知道了类型,因此您拥有:
A<Foo> a = new A<Foo>(Foo.class);
答案 2 :(得分:0)
没有。此外,没有办法指定T
有一个no-args构造函数,或者甚至是非抽象的。
您可以传入抽象工厂或原型。
请不要使用反射!!!