实例化参数类型的对象
2022-08-31 09:45:09
我有一个模板类,如下所示:
class MyClass<T>
{
T field;
public void myMethod()
{
field = new T(); // gives compiler error
}
}
如何在我的类中创建新的 T 实例?
我有一个模板类,如下所示:
class MyClass<T>
{
T field;
public void myMethod()
{
field = new T(); // gives compiler error
}
}
如何在我的类中创建新的 T 实例?
在类型擦除之后,所有已知的就是它是 的某个子类。您需要指定一些工厂来创建 的实例。T
Object
T
一种方法可以使用供应商<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();
}
}
另一种非反射性方法是使用混合生成器/抽象工厂模式。
在 Effective Java 中,Joshua Bloch 详细介绍了 Builder 模式,并提倡通用的 Builder 接口:
public interface Builder<T> {
public T build();
}
混凝土生成器可以实现此接口,外部类可以使用混凝土生成器根据需要配置生成器。生成器可以作为 传递给 MyClass。Builder<T>
使用此模式,您可以获取 的新实例,即使 具有构造函数参数或需要其他配置。当然,您需要一些方法将生成器传递到 MyClass 中。如果你不能将任何东西传递到MyClass中,那么Builder和Abstract Factory就出来了。T
T