リフレクションを使用してスーパークラスに渡される型パラメータ値を見つけるにはどうすればよいですか?リフレクションを使用した型パラメータへのアクセス
たとえば、Bar.class
と指定すると、Integer.class
〜Foo
の型パラメータT
がどのように渡されるのですか?
public class Foo<T> {
}
public class Bar extends Foo<Integer> {
}
ありがとう!
リフレクションを使用してスーパークラスに渡される型パラメータ値を見つけるにはどうすればよいですか?リフレクションを使用した型パラメータへのアクセス
たとえば、Bar.class
と指定すると、Integer.class
〜Foo
の型パラメータT
がどのように渡されるのですか?
public class Foo<T> {
}
public class Bar extends Foo<Integer> {
}
ありがとう!
バーは、特定のFooを拡張するクラスであるので、あなたはこの作品だけ
ParameterizedType type = (ParameterizedType) Bar.class.getGenericSuperclass();
System.out.println(type.getRawType()); // prints; class Foo
Type[] actualTypeArguments = type.getActualTypeArguments();
System.out.println(actualTypeArguments[0]); // prints; class java.lang.Integer
を試すことができます。以下のような変数を宣言した場合、実行時にintFooのパラメータ型を決定することはできません。上記の
Foo<Integer> intFoo = new Foo<Integer>();
public class Bar extends Foo<Integer> {
public Class getTypeClass {
ParameterizedType parameterizedType =
(ParameterizedType) getClass().getGenericSuperClass();
return (Class) parameterizedtype.getActualTypeArguments()[0];
}
}
は実用的な状況、のほとんどで動作しますがを保証しない、なぜなら型消去のため、直接これを実行する方法はありません必要があります。
この場合、getTypeClass()にはクラスまたはInteger.classを返すことができます。 ;) –
@Peterはい。私はちょうど一般的な方法でプロセスを表示しようとしました:) –