リフレクションを使用してジェネリック型のフィールドにアクセスする方法を知っていますfield.getGenericType() instanceof ParameterizedType
。
しかし、どこで宣言されたかわからない任意のオブジェクトについて、どうすれば同じことを確認できるでしょうか?
リフレクションを使用してジェネリック型のフィールドにアクセスする方法を知っていますfield.getGenericType() instanceof ParameterizedType
。
しかし、どこで宣言されたかわからない任意のオブジェクトについて、どうすれば同じことを確認できるでしょうか?
ジェネリックは、オブジェクト自体ではなく、変数宣言、メソッドの戻り値の型などに適用されます。Class
特定のオブジェクトの がジェネリックを使用しているかどうかを判断することはmyObj.getClass().getTypeParameters()
できますが、特定のオブジェクト インスタンスが作成された型パラメーターの値を判断することはできません。
オブジェクトは一般的な情報自体を保存しないため、 用に生成されたバイトコードは 用のnew ArrayList<Integer>()
ものとまったく同じですnew ArrayList<String>()
。私は正確に意味します。これは、Java ジェネリックの型消去と呼ばれるものです。それらは に脱糖されているだけですnew ArrayList()
。
ただし、他のほとんどすべての状況では、フィールド/パラメーター/戻り値の型宣言など、型パラメーターは保持されます。保持され、消去されないケースの 1 つは、クラスのスーパー クラスです。したがって、拡張するクラスを作成するとArrayList<String>
、実行時にその情報にアクセスできます。
しかし、これはやり過ぎに思えますね。拡張する新しいクラスと拡張するArrayList<String>
別のクラスArrayList<String>
などは非現実的です。匿名の内部クラスを使用すると、これがはるかに簡単になります。したがって、一般的な情報を保持したい場合は、new ArrayList<String>() {}
代わりにnew ArrayList<String>()
. getClass().getGenericSuperclass()
作成されたオブジェクトを呼び出して、一般的な情報を取得できます。