说我有一个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
之间的匹配我不明白区别。 –