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

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

问题描述:

我有这个类:如何创建泛型类型的新对象?

public class A<T> { 
    protected T something = new T(); 
    ... 
} 

当然new T()是不可能的。我能做些什么呢?

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

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

+0

这是非常开放的。你能提供更多关于你想要完成的信息吗? – AndrewC 2012-02-22 15:11:04

+0

可以在运行时确定传递给A的类型参数,而不显式地将该类传递给A的构造函数。但正如其他人所问,为什么当你不需要时你真的想这样做呢? – 2012-02-22 15:15:46

+0

(令人困惑的是,该问题使用的类名实际上与通用参数名称匹配,因为该问题涉及泛型。) – 2012-02-22 15:16:10

您可以收到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扩展工厂',因此您可以在'newInstance'方法内调用'new Dongle()'。否则,你不会在工厂中遇到同样的问题。 – 2012-02-22 15:13:12

你可以有一个构造函数(或方法),其采用Class<T>参数,并有clazz.newInstance()

当你实例化对象,你知道的类型,所以你必须:

A<Foo> a = new A<Foo>(Foo.class); 
+0

我不能改变我的类的构造函数被调用的代码。 – yoooshi 2012-02-22 15:12:29

+1

然后 - 没办法.. – Bozho 2012-02-22 15:15:03

+0

1.你应该说这是你问题的一部分。 2.为什么这种情况在你无法修改的班级中存在?或者你只能修改部分内容?我不明白 - 这是功课吗? – 2012-02-22 15:16:37

不,也没有办法指定T有一个无参数构造函数,或者甚至是非抽象的。

您可以传入抽象工厂或原型。

请不要使用反射!