8

リフレクションを使用して、Java で汎用パラメーター化されたクラスを作成するにはどうすればよいですか?

私は持っている

public class SomeClass<T> {
   public SomeClass<T>() {
   }
}

そのインスタンスが必要です。

私はのバリエーションを試しました

Class c = Class.forName("SomeClass");

しかし、適切に型付けされたインスタンスを取得できる構文が見つかりませんでした。

SomeType instance = (SomeType)Class.forName("SomeClass<SomeType>").createInstance();

では、どうすればこれを行うことができますか?

4

3 に答える 3

8

Java は消去ベースのジェネリックを使用します (つまり、型パラメーターは実行時に消去されます。たとえば、実行時に同じ型として扱われます) List<Integer>List<String>リフレクションは本質的にランタイム機能であるため、型パラメーターは使用されず、まったく関与しません。

つまり、リフレクションを使用している場合は、生の型 ( SomeClass, not )のみをインスタンス化できます。SomeClass<T>次に、型をジェネリック バージョンに手動でキャストする必要があります (そしてunchecked警告を生成します)。

于 2011-06-16T14:48:28.057 に答える
2

を参照/検索し"Type erasure"ます。ジェネリックはコンパイル時用であり、実行時には利用できないため、あなたが試みていることは不可能です。リフレクションには raw タイプを使用する必要があります

于 2011-06-16T14:49:20.970 に答える
1

タイプ eraserのため、実行時SomeClassに残っているのは だけですSomeClass<SomeType>

于 2011-06-16T14:50:21.597 に答える