После стирания типа все, что известно о T
, это то, что это некоторый подкласс Object
. Вам нужно указать фабрику для создания экземпляров T
.
Один подход может использовать Supplier<T>
:
class MyClass<T> {
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<StringBuilder> it = new MyClass<>(StringBuilder::new);
В качестве альтернативы, вы можете предоставить Class<T>
объект, а затем использовать отражение.
class MyClass<T> {
private final Constructor<? extends T> ctor;
private T field;
MyClass(Class<? extends T> impl) throws NoSuchMethodException {
this.ctor = impl.getConstructor();
}
public void myMethod() throws Exception {
field = ctor.newInstance();
}
}