2

リフレクションを使用してジェネリック型のフィールドにアクセスする方法を知っていますfield.getGenericType() instanceof ParameterizedType

しかし、どこで宣言されたかわからない任意のオブジェクトについて、どうすれば同じことを確認できるでしょうか?

4

2 に答える 2

2

ジェネリックは、オブジェクト自体ではなく、変数宣言、メソッドの戻り値の型などに適用されます。Class特定のオブジェクトの がジェネリックを使用しているかどうかを判断することはmyObj.getClass().getTypeParameters()できますが、特定のオブジェクト インスタンスが作成された型パラメーターの値を判断することはできません。

于 2012-10-03T16:01:56.710 に答える
2

オブジェクトは一般的な情報自体を保存しないため、 用に生成されたバイトコードは 用のnew ArrayList<Integer>()ものとまったく同じですnew ArrayList<String>()。私は正確に意味します。これは、Java ジェネリックの型消去と呼ばれるものです。それらは に脱糖されているだけですnew ArrayList()

ただし、他のほとんどすべての状況では、フィールド/パラメーター/戻り値の型宣言など、型パラメーターは保持されます。保持され、消去されないケースの 1 つは、クラスのスーパー クラスです。したがって、拡張するクラスを作成するとArrayList<String>、実行時にその情報にアクセスできます。

しかし、これはやり過ぎに思えますね。拡張する新しいクラスと拡張するArrayList<String>別のクラスArrayList<String>などは非現実的です。匿名の内部クラスを使用すると、これがはるかに簡単になります。したがって、一般的な情報を保持したい場合は、new ArrayList<String>() {}代わりにnew ArrayList<String>(). getClass().getGenericSuperclass()作成されたオブジェクトを呼び出して、一般的な情報を取得できます。

于 2012-10-03T18:14:12.693 に答える