我有一个像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];