1. ホーム
  2. java

[解決済み] パラメータ型のオブジェクトのインスタンス化

2022-02-12 20:54:55

質問

以下のようなテンプレートクラスがあります。

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

私のクラスでTの新しいインスタンスを作成するにはどうすればよいですか?

どのように解決するのですか?

タイプ消去の後、わかっていることはすべて T のサブクラスであるということです。 Object . のインスタンスを作成するためのファクトリを指定する必要があります。 T .

1つのアプローチとして 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();
  }

}