如何检索泛型类型的参数?

时间:2017-03-08 15:30:49

标签: java reflection

说我有ParameterizedType具有特定类型:Container<Integer>, 如何从中获取非特定类型:Container<E>

我希望能够将类型参数E与其具体值Integer匹配。

为了说清楚,我对将Int从Container<Integer>字段中删除的常见问题不感兴趣。

2 个答案:

答案 0 :(得分:2)

这可能比描述的更棘手,因为类型变量也可能来自层次结构中的任何位置,并且变量索引可以在每个级别轻松更改。 E.g:

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的维护者

答案 1 :(得分:1)

ParameterizedType可让您使用ParameterizedType#getRawType()获取其原始类型版本。这将返回一个TypeClass(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]

元素将在各自的数组中处于相同的索引处。