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

我想通过反射来了解myPojos的上限是MyPojo类型的事实。

我可以先获取 Field ,然后再获取 getGenericType ,但这只是返回一个没有方法的 Type 。我可以将其转换为 ParameterizedType ,但可以转换为 getActualTypeArguments()
toString()上的ParameterizedType方法返回期望值,似乎无法访问通配符上键上的信息,并且ParameterizedType的所有实现似乎都在sun.包中。

因此,是否可以在不解析toString()输出的情况下获取泛型类型的上限,而不必依靠sun.*类呢?还是由于擦除而丢失了此信息?

最佳答案

您确实需要强制转换为ParameterizedType,然后将Type值从getActualTypeArguments()强制转换为WildcardType,后者具有getUpperBounds()方法。

所以

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

07-24 21:16