我知道Java的泛型在某种程度上逊于.Net。
我有一个泛型类Foo<T>,我确实需要使用无参数构造函数实例化T in Foo。如何解决Java的局限性?
Foo<T>
T in Foo
一种选择是传递Bar.class(或你感兴趣的任何类型-以任何方式指定适当的Class<T>引用)并将该值保留为字段:
Bar.class
Class<T>
public class Test { public static void main(String[] args) throws IllegalAccessException, InstantiationException { Generic<Bar> x = new Generic<>(Bar.class); Bar y = x.buildOne(); } } public class Generic<T> { private Class<T> clazz; public Generic(Class<T> clazz) { this.clazz = clazz; } public T buildOne() throws InstantiationException, IllegalAccessException { return clazz.newInstance(); } } public class Bar { public Bar() { System.out.println("Constructing"); } }
另一种选择是具有“工厂”接口,然后将工厂传递给泛型类的构造函数。这更加灵活,你无需担心反射异常。