0

重複の可能性:
リフレクションを使用して Java でジェネリック パラメーターの型を
取得する 実行時にクラスのジェネリック型を取得する

次のようなクラスがあるとします。

public class Foo<T, M> {
  Pair<T, M> bar;
}

実行時に「T」と「M」が何であるかを判断する方法はありますか? 例えば

Foo<String, Integer> foo1 = new Foo<String, Integer>();
Foo<Integer, Boolean> foo2 = new Foo<Integer, Boolean>();
// what happens next?

ありがとう!

4

3 に答える 3

4

いいえ、ありません。それはほとんど型消去の定義です。

とはいえ、いくつかのファンキーな回避策があります。ペアのコンポーネントを明示的に検索し、それらのタイプを尋ねることができます。Guava のTypeToken使用などの匿名内部クラスでクールなトリックを使用できます-実行時に型を決定することはできませんがnew Foo<String, Integer>()、実行時に型を決定することはできnew Foo<String, Integer>() {}ます-匿名の内部クラスに注意してください。これ汎用パラメーターを保持しますそのスーパークラス、つまり に指定されていますFoo。(開示:私はGuavaに貢献しています。)

多くの場合、最善の解決策は、最初からこの情報を必要としないことです。これを行う方法についての一般的なクックブックはありませんが、通常は可能です。

とは言っても、この必要性に対する唯一の一般的な解決策は、Classメタデータを明示的に渡すことです。

于 2012-07-19T14:32:36.110 に答える
1

ランタイムの一般情報は消去されます。クラスがコンパイルされるとすぐに、すべてのジェネリック型情報が消去され、置き換えられます。

型パラメーターが制限されていない場合は、それらの境界またはオブジェクトを持つジェネリック型のすべての型パラメーター

于 2012-07-19T14:33:56.937 に答える
0

実際にはjava.lang.reflect.Field、一般的な情報が保持されます。したがって、リフレクションを使用すると、一般的な情報を取得できますが、クラス/インスタンス変数についてのみ取得できます (メソッドの戻り値の型やローカル変数ではありません)。

したがって、あなたの場合、 foo1 と foo2 がいくつかのクラスのインスタンス変数である場合:

class FooTest {
    Foo<String, Boolean> foo1;
}

次に、を確認できるインスタンスFooTest.class.getDeclaredField("foo1").getGenericType()を返します。ParameterizedTypegetActualTypeArguments()

于 2012-07-19T14:45:33.673 に答える