2017-03-08 9 views
1

私は具体的なタイプのParameterizedTypeを持っていると言います。Container<Integer>、 具体的なタイプはContainer<E>です。ジェネリック型の型パラメータはどのように取得しますか?

タイプ引数Eと具体的な値Integerを一致させたいと考えています。

私は、Container<Integer>フィールドからIntを取得する一般的な質問には興味がありません。

+1

[実行時にクラスのジェネリックタイプを取得する]の可能な複製(http://stackoverflow.com/questions/3403909/get-generic-type-of-class-at-runtime ) –

+0

これは別の質問ですが、私は具体的なタイプを取得することに興味はありませんが、 TypeVariable(Impl)とその具体的な割り当ての一致を得るのに、 – harel

+0

私はその違いを理解していません。 –

答えて

1

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] 

要素は、それぞれの配列内の同じインデックスであろう。

2

これは、タイプ変数が階層内のどこからでも来る可能性があり、変数インデックスが各レベルで簡単に変更できるため、これは説明したよりも扱いにくい場合があります。例:

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ライブラリのメンテナーです

関連する問題