3

オンラインのいくつかの場所で、状況によってはリフレクション API を使用して、型消去によって失われると思われるジェネリック データ型に関する情報を取得できると言及されているのを見ました。

タイプの消去が完了していない状況の完全なリストを探しています。つまり、リフレクションを介して何かがまだアクセス可能です。ジェネリック型で取得できる例と関連するリフレクション コードの適切なリストは優れています。

UPDATE http://tutorials.jenkov.com/java-reflection/generics.htmlには、まさに私が探していた例がありました。

4

2 に答える 2

8

私はそれがこれに帰着すると思います:

  • 型情報を格納するオブジェクト インスタンスはありません。

  • ただし、クラスはすべてのジェネリック シグネチャを保持します (そうしないと、コンパイル時にジェネリック型チェックを行うことができません)。

したがって、リフレクションを使用すると、特定のクラスのジェネリック型情報を読み取ることができます。

例:

 class MyList extends ArrayList<MyObject>{}

 List<MyObject> x = new MyList();

リフレクションは、これが MyObject のリストであることを示します (この情報は MyList クラスにコンパイルされるため)。

しかし

List<MyObject> x = new ArrayList<MyObject>();

リフレクションは有用なことを何も教えてくれません (ArrayListクラスは MyObject について何も知らないため)。

于 2012-08-06T05:35:31.890 に答える
2

一般的な考え方は、型パラメーターの特定の型を持つジェネリック型のサブクラスである名前付きクラスまたは匿名クラスを作成する場合、サブクラスはジェネリックではなく、型消去の対象にならないということです。サブクラスのオブジェクトを取得できると仮定すると、そのClassオブジェクトでリフレクションを使用して、パラメーターの型を調べることができます。

考えてみれば、これは実際には消去規則の「例外」ではありません。むしろ、問題のクラスを明示的に具象化することによって、そのクラスが一般的でないように調整しています。

于 2012-08-06T05:35:58.867 に答える