說我有一個ParameterizedType
與一個特定類型:Container<Integer>
, 我怎樣才能得到它的非特定類型:Container<E>
。如何檢索泛型類型的類型參數?
我希望能夠匹配類型參數E
及其具體值Integer
。
只是爲了說清楚,我不感興趣的是從Container<Integer>
字段中獲取Int的常見問題。
說我有一個ParameterizedType
與一個特定類型:Container<Integer>
, 我怎樣才能得到它的非特定類型:Container<E>
。如何檢索泛型類型的類型參數?
我希望能夠匹配類型參數E
及其具體值Integer
。
只是爲了說清楚,我不感興趣的是從Container<Integer>
字段中獲取Int的常見問題。
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]
元素將在在它們各自的陣列相同的索引。
這可能比描述更棘手,因爲類型變量也可能來自層次結構中的任何位置,並且變量索引可以在每個級別輕鬆更改。例如:
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
可能的重複[在運行時獲取泛型類型](http://stackoverflow.com/questions/3403909/get-generic-type-of-class-at-runtime ) –
這是一個不同的問題,我對獲取具體類型不感興趣,但在獲得TypeVariable(Impl)和它的具體賦值 – harel
之間的匹配我不明白區別。 –