如何获取通配符通用字段的上限?

时间:2014-01-16 22:39:51

标签: java generics reflection wildcard

我有一个像List<? extends MyPojo> myPojos = new ArrayList<>();这样的字段。

我想 - 通过反思 - 得到myPojos的上限是MyPojo类型的事实。

我可以Field没问题,然后getGenericType,但这只会返回一个没有方法的Type。我可以将其投放到ParameterizedType,但getActualTypeArguments()

toString()上的ParameterizedType方法返回预期值,似乎无法访问上层通配符上的信息,ParameterizedType的所有实现似乎都是在sun.包中。

那么,我可以在不解析toString()输出的情况下获取泛型类型的上限而不依赖于sun.*类吗?或者这些信息是否因擦除而丢失?

1 个答案:

答案 0 :(得分:5)

您需要转换为ParameterizedType,然后将Type值从getActualTypeArguments()转换为WildcardType,其中getUpperBounds()方法。

所以

assert MyPojo.class == ((WildcardType) ((ParameterizedType) listField.getGenericType()).getActualTypeArguments()[0]).getUpperBounds()[0];