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

时间:2012-02-22 15:07:04

标签: java generics

我上过这堂课:

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

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

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

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

3 个答案:

答案 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构造函数,或者甚至是非抽象的。

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

请不要使用反射!!!