在类型擦除之后,关于T的所有知识是它是Object的一些子类。你需要指定一些工厂来创建T的实例。
class MyClass {
private final Supplier extends T> ctor;
private T field;
MyClass(Supplier extends T> ctor) {
this.ctor = Objects.requireNonNull(ctor);
}
public void myMethod() {
field = ctor.get();
}
}
用法可能如下所示:
MyClass it = new MyClass<>(StringBuilder::new);
或者,您可以提供类< T>对象,然后使用反射。
class MyClass {
private final Constructor extends T> ctor;
private T field;
MyClass(Class extends T> impl) {
this.ctor = impl.getConstructor();
}
public void myMethod() throws Exception {
field = ctor.newInstance();
}
}