Neal Gafter は型トークンを導入しました (例: Class<String>
)。実行時にのインスタンスにアクセスできると仮定するとClass<String>
、実行時にジェネリック型 ( String
) を取得できますか?
Method.getGenericReturnType()に似たものを探しています。
フィールド/メソッドでのみ可能だと思います。型消去のため、実行時にクラス固有のジェネリック型を取得できません。クラスにアクセスできる場合にできるハックがあるようです。この議論を読んでください。
それはあなたが望むもののように聞こえますParameterizedType
。
Class
これらは、aとそれに由来するオブジェクト(Method
、 )を反映することで取得できますField
。ParameterizedType
ただし、古いClass
オブジェクトからを取得することはできません。Class
ジェネリッククラスまたはインターフェイスを拡張する型を表すインスタンスから取得できます。
C# とは異なり、Java では実行時に Generics は存在しません。したがって、実行時にジェネリック型のインスタンスを作成したり、ジェネリック型の型を見つけたりすることはできません。
Bob Lee の Gafter の Gadget パターンの精緻化のバリエーションを使用して可能です。
public class GenericTypeReference<T> {
private final Type type;
protected GenericTypeReference() {
Type superclass = getClass().getGenericSuperclass();
if (superclass instanceof Class) {
throw new RuntimeException("Missing type parameter.");
}
this.type = ((ParameterizedType) superclass).getActualTypeArguments()[0];
}
public Type getType() {
return this.type;
}
public static void main(String[] args) {
// This is necessary to create a Class<String> instance
GenericTypeReference<Class<String>> tr =
new GenericTypeReference<Class<String>>() {};
// Retrieving the Class<String> instance
Type c = tr.getType();
System.out.println(c);
System.out.println(getGenericType(c));
}
public static Type getGenericType(Type c) {
return ((ParameterizedType) c).getActualTypeArguments()[0];
}
}
上記のコードは次を出力します。
java.lang.Class<java.lang.String>
class java.lang.String