1
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 对象的集合(我没有要检查的实际参数实例)

4

3 回答 3

1

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

于 2012-10-22T09:55:44.210 回答
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

于 2015-08-29T11:12:10.227 回答
0

据我了解,你不能这样做。

您可以使用 提取Child(StringInteger)的类型参数getActualTypeArguments(),但不能将它们与Tin相关联Super<T>

您也可以从中提取Tclass Child extends Super<Integer>但这不是您的情况。

这意味着如果你想Collection<MyClass>在参数中找到,你只能在有 时才能做到method(Collection<MyClass>),但不能method(ArrayList<MyClass>)或其他。

于 2012-10-22T10:06:53.233 回答