如何创建泛型类型的新对象?
问题描述:
我有这个类:如何创建泛型类型的新对象?
public class A<T> {
protected T something = new T();
...
}
当然new T()
是不可能的。我能做些什么呢?
我不能改变调用这个类的构造函数的代码,因为这是通过反射完成的。
另一个问题是如何获取泛型类的Class对象。的MyMethod(的A.class)工作过,但现在已经拿到了参数T
答
您可以收到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>
可以用这个构造函数以外的东西来创建新的实例。
+0
+1工厂解决方案非常好,但是您需要使用类'DongleFactory扩展工厂
答
不,也没有办法指定T
有一个无参数构造函数,或者甚至是非抽象的。
您可以传入抽象工厂或原型。
请不要使用反射!
这是非常开放的。你能提供更多关于你想要完成的信息吗? – AndrewC 2012-02-22 15:11:04
可以在运行时确定传递给A的类型参数,而不显式地将该类传递给A的构造函数。但正如其他人所问,为什么当你不需要时你真的想这样做呢? – 2012-02-22 15:15:46
(令人困惑的是,该问题使用的类名实际上与通用参数名称匹配,因为该问题涉及泛型。) – 2012-02-22 15:16:10