1. ホーム
  2. java

[解決済み] Javaでジェネリッククラスをインスタンス化する【重複】について

2022-04-26 03:01:46

質問

Javaのジェネリックが.Netにやや劣るのはわかるが。

ジェネリッククラスがあります Foo<T> をインスタンス化する必要があります。 TFoo をパラメータなしのコンストラクタで使用します。Java の制限を回避するにはどうしたらよいでしょうか?

解決方法は?

一つの方法は Bar.class (または、興味のあるタイプなら何でも構いません - 適切な Class<T> を参照)、その値をフィールドとして保持します。

public class Test {
    public static void main(String[] args) throws IllegalAccessException,
            InstantiationException {
        Generic<Bar> x = new Generic<>(Bar.class);
        Bar y = x.buildOne();
    }
}

public class Generic<T> {
    private Class<T> clazz;

    public Generic(Class<T> clazz) {
        this.clazz = clazz;
    }

    public T buildOne() throws InstantiationException, IllegalAccessException {
        return clazz.newInstance();
    }
}

public class Bar {
    public Bar() {
        System.out.println("Constructing");
    }
}

もうひとつの方法は、ファクトリーインターフェースを用意し、ジェネリッククラスのコンストラクターにファクトリーを渡す方法です。これはより柔軟で、リフレクションの例外を心配する必要がありません。