私は具体的なタイプのParameterizedType
を持っていると言います。Container<Integer>
、 具体的なタイプはContainer<E>
です。ジェネリック型の型パラメータはどのように取得しますか?
タイプ引数E
と具体的な値Integer
を一致させたいと考えています。
私は、Container<Integer>
フィールドからIntを取得する一般的な質問には興味がありません。
私は具体的なタイプのParameterizedType
を持っていると言います。Container<Integer>
、 具体的なタイプはContainer<E>
です。ジェネリック型の型パラメータはどのように取得しますか?
タイプ引数E
と具体的な値Integer
を一致させたいと考えています。
私は、Container<Integer>
フィールドからIntを取得する一般的な質問には興味がありません。
ParameterizedType
は、生タイプのバージョンをParameterizedType#getRawType()
にできます。それはClass
(afaik、それはない場合がありますエッジケースがあるかもしれない)Type
値を返しますので、それをキャストします。 Class
を使用して、対応するタイプパラメータをClass#getTypeParameters()
で取得します。例えば
public class Sample {
public static void main(String args[]) throws Exception {
ParameterizedType type = (ParameterizedType) IntegerContainer.class.getGenericInterfaces()[0];
Class<?> rawType = (Class<?>) type.getRawType();
TypeVariable<? extends Class<?>>[] typeVariables = rawType.getTypeParameters();
System.out.println(Arrays.toString(type.getActualTypeArguments()));
System.out.println(Arrays.toString(typeVariables));
}
}
interface Container<E> {
}
interface IntegerContainer extends Container<Integer> {
}
プリント
[class java.lang.Integer]
[E]
要素は、それぞれの配列内の同じインデックスであろう。
これは、タイプ変数が階層内のどこからでも来る可能性があり、変数インデックスが各レベルで簡単に変更できるため、これは説明したよりも扱いにくい場合があります。例:
interface Container<E, T> {
}
//Notice how E, T became T, E, so indices can not be trusted
interface SubContainer<E, T> extends Container<T, E> {
}
これは、階層を歩き、各レベルで変数を収集する必要があることを意味します。
私はそれが既に複雑で面倒を(すでに可変解像度を自分でやってなくて、あなたが後にしている何をすべきかの方法があるかもしれない)として使用すると、同様のシナリオに GeAnTyRefを使用することをお勧め:
Type resolved = new TypeToken<Container<Integer>>(){}.getType(); //or get the instance in any way you already do
TypeVariable variable = Container.class.getTypeParameters()[0];
GenericTypeReflector.getTypeParameter(resolved, variable); //Gets you Integer
公開:私はGeAnTyRefライブラリのメンテナーです
[実行時にクラスのジェネリックタイプを取得する]の可能な複製(http://stackoverflow.com/questions/3403909/get-generic-type-of-class-at-runtime ) –
これは別の質問ですが、私は具体的なタイプを取得することに興味はありませんが、 TypeVariable(Impl)とその具体的な割り当ての一致を得るのに、 – harel
私はその違いを理解していません。 –