java - 实例化类型参数的对象

标签 java generics reflection

我有一个模板类如下:

class MyClass<T>
{
    T field;
    public void myMethod()
    {
       field = new T(); // gives compiler error
    }
}

如何在我的类中创建一个新的 T 实例?

最佳答案

类型删除后,关于 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();
  }

}

关于java - 实例化类型参数的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/299998/

相关文章:

java - Google App Engine Standard env - 找不到 Controller 方法 - Spring Boot 应用程序

java - 从 Class 文件和 Jar 文件创建 JAR 文件

c# - AppDomain.CreateInstanceFromAndUnwrap 问题

c# - 无论如何,是否有 "inject"代码反射到静态类中?

java - recyclerview 中的多个倒计时器

java - if 语句中 x 可以等于一系列数字/数字范围?

swift - 实现泛型协议(protocol)方法但对整个类使用泛型

swift - 为什么这个基本类型扩展不起作用?

c# - C# 中的泛型对象

c# - 并排装配加载问题