获取泛型参数的通用超类

时间:2012-10-22 09:50:15

标签: java reflection

class Super<T> {}

class Child<A, B> extends Super<B> {}

class Code {
  public void method(Child<String, Integer> child) {}
}

我可以使用反射来获取参数类型:

ParameterizedType ptype = (ParameterizedType) Code.class.getMethod("method").getGenericParameterTypes()[0]

但是如何获得ptype的通用超类(不仅意味着Super.class,还包含类型参数Integer

我的用例是我想使用反射来确定方法的一个参数是否是MyClass对象的集合(我没有要检查的实际参数实例)

3 个答案:

答案 0 :(得分:1)

在编译期间,类型参数在java中被擦除。看herethere。所以你可能无法做到这一点。

答案 1 :(得分:1)

嗯,从上面的例子中你可以做到。因为您可以提取方法参数(Child)的第二个类型参数(Integer)的实际类型。

Method method = Code.class.getMethod("method", Child.class);
ParameterizedType parameterType = (ParameterizedType) method.getGenericParameterTypes()[0];
Type secondType = parameterType.getActualTypeArguments()[1];
System.out.println(secondType == Integer.class);

返回true

答案 2 :(得分:0)

据我所知,你不能这样做。

您可以使用Child提取StringIntegergetActualTypeArguments())的类型参数,但无法将它们与T Super<T>相关联}。

您也可以从T中提取class Child extends Super<Integer>,但事实并非如此。

这意味着,如果您想在参数中找到Collection<MyClass>,只有method(Collection<MyClass>),而不是method(ArrayList<MyClass>)或其他内容,您才能这样做。