2017-03-08 147 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