method.getgenericparametertypes() 返回的通配符类型是独立的 wildcardtype 实例,需主动识别上下界;它作为 type 的直接子接口,与 parameterizedtype、typevariable 并列,不嵌套于其他类型中。

Java 中 `Method.getGenericParameterTypes()` 能返回通配符类型(如 ? extends Number、? super String),但不会直接给出“通配符”这个语义标签——它返回的是 WildcardType 实例,需主动识别并解析其上下界。
WildcardType 是独立的 Type 子接口
WildcardType 和 ParameterizedType、TypeVariable 一样,是 Type 的直接子接口,表示形如 ?、? extends T 或 ? super U 的通配符类型。它不继承其他泛型类型接口,也不嵌套在 ParameterizedType 里——而是作为独立元素出现在 getActualTypeArguments() 或 getGenericParameterTypes() 的结果数组中。
- 例如方法
void process(List extends Runnable> list),其第一个参数的Type就是WildcardType,不是ParameterizedType - 调用
method.getGenericParameterTypes()[0]得到的就是该WildcardType实例,可安全强转
通配符的上下界需显式提取
WildcardType 提供两个关键方法:getUpperBounds() 和 getLowerBounds()。它们都返回 Type[] 数组,但实际使用中几乎总是长度为 1 或 0:
-
? extends Number→getUpperBounds()返回[Number.class],getLowerBounds()返回空数组 -
? super IOException→getLowerBounds()返回[IOException.class],getUpperBounds()返回[Object.class](JVM 规范规定下界通配符默认上界为Object) -
?(无界)→ 两者都返回长度为 1 的数组:getUpperBounds()[0] == Object.class,getLowerBounds().length == 0
通配符常作为嵌套结构的一部分出现
通配符极少单独作为参数类型,更多出现在泛型参数内部。例如:
-
Map, ? extends Collection>> map:参数类型是ParameterizedType,其getActualTypeArguments()返回三个WildcardType元素 -
Function super Integer, ? extends Number>:两个参数位置分别对应一个WildcardType - 解析时需逐层判断每个
Type元素的运行时类型:instanceof WildcardType→ 强转 → 调用上下界方法
注意擦除与桥接方法带来的限制
并非所有带 ? 的源码声明都能在运行时还原为 WildcardType:
- 若方法来自泛型类继承链中的桥接方法(bridge method),JVM 可能已擦除通配符,返回的是原始
Class(如List.class) - 仅当方法签名在源码中**显式声明含通配符**,且未被编译器优化或桥接覆盖时,
getGenericParameterTypes()才会返回WildcardType - 可通过
method.isBridge() == false排除桥接干扰,优先检查非桥接方法
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











