在 Java 中实例化泛型类
我知道Java的泛型有点不如.网易.
我有一个泛型类,我真的需要使用无参数构造函数实例化一个。如何解决Java的限制?Foo<T>
T
Foo
我知道Java的泛型有点不如.网易.
我有一个泛型类,我真的需要使用无参数构造函数实例化一个。如何解决Java的限制?Foo<T>
T
Foo
一种选择是传入(或您感兴趣的任何类型 - 指定适当引用的任何方法)并将该值保留为字段: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");
}
}
另一种选择是具有“工厂”接口,并将工厂传递给泛型类的构造函数。这样更灵活,您无需担心反射异常。
这是工厂的实现,正如Jon Skeet所建议的那样:
interface Factory<T> {
T factory();
}
class Araba {
//static inner class for Factory<T> implementation
public static class ArabaFactory implements Factory<Araba> {
public Araba factory() {
return new Araba();
}
}
public String toString() { return "Abubeee"; }
}
class Generic<T> {
private T var;
Generic(Factory<T> fact) {
System.out.println("Constructor with Factory<T> parameter");
var = fact.factory();
}
Generic(T var) {
System.out.println("Constructor with T parameter");
this.var = var;
}
T get() { return var; }
}
public class Main {
public static void main(String[] string) {
Generic<Araba> gen = new Generic<Araba>(new Araba.ArabaFactory());
System.out.print(gen.get());
}
}
输出:
Constructor with Factory<T> parameter
Abubeee