当getactualtypearguments()返回wildcardtype时,需用instanceof wildcardtype判断并强转,再调用getupperbounds()和getlowerbounds()获取上下界,注意二者不会同时非空,且不可用字符串匹配判断。

当 `ParameterizedType.getActualTypeArguments()` 返回的某个类型参数是通配符(如 List extends Number> 中的 ? extends Number)时,该元素的运行时类型就是 WildcardType —— 这是 Java 泛型反射的正常行为,无需特殊处理,但需要正确识别和使用。
如何判断返回的是 WildcardType
调用 getActualTypeArguments() 后,对每个返回的 Type 做类型检查即可:
- 用
instanceof WildcardType判断是否为通配符类型 - 若为真,可安全强转为
WildcardType - 注意:不能用
getClass().getName()或字符串匹配来判断,应依赖接口类型
从 WildcardType 获取上下界信息
WildcardType 提供两个关键方法:
-
getUpperBounds():返回上界类型数组,默认是{Object.class}(即?等价于? extends Object) -
getLowerBounds():返回下界类型数组,仅当声明为? super X时非空(此时上界仍为Object) - 注意:一个通配符**不会同时有非 Object 的上界和非空下界**(Java 语法禁止
? extends X & super Y)
常见误判与注意事项
以下情况容易混淆,需特别留意:
-
Class类型(如String.class)不是WildcardType,也不会出现在getActualTypeArguments()结果中 —— 它是具体类型,属于Class>实例 -
TypeVariable(如T)和WildcardType(如? extends T)不同:前者是声明期占位符,后者是使用期通配符 - 嵌套通配符(如
Map, List super CharSequence>>)会逐层返回对应层级的WildcardType,需递归处理
简单示例代码片段
假设你有一个字段 private List super String> list;:
Field f = clazz.getDeclaredField("list");
ParameterizedType pt = (ParameterizedType) f.getGenericType();
Type arg = pt.getActualTypeArguments()[0]; // 就是 ? super String
if (arg instanceof WildcardType wct) {
Type[] lower = wct.getLowerBounds(); // [String.class]
Type[] upper = wct.getUpperBounds(); // [Object.class]
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











