2017-03-08 86 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()。這將返回一個Type的值,這將是一個Class(afaik,有可能是邊緣情況,它不是),所以施展它。然後使用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的維護者lib