wildcardtype 的 getupperbounds() 总返回非空数组(裸通配符为 [object.class]),而 getlowerbounds() 仅当含 super 时返回长度为1的数组,否则为空数组;遍历时需先判长。

WildcardType 是 Java 反射中表示通配符类型(如 ? extends Number、? super String、?)的接口。它的 getUpperBounds() 和 getLowerBounds() 方法用于获取通配符的上界与下界,但它们的返回值和遍历行为有明确规则,不是所有情况都返回非空数组。
上界 getUpperBounds() 的规则
通配符默认隐含上界 Object,但只有显式声明 extends 时,该上界才会出现在 getUpperBounds() 返回数组中;未写 extends(即裸通配符 ?)时,返回长度为 1 的数组,元素为 Object.class。
-
? extends Number→ 返回[Number.class] -
? extends Comparable<string> & Serializable</string>→ 返回长度 ≥1 的数组,按声明顺序包含各上界类型(注意:Java 不允许extends后跟多个类,但允许多个接口,此时数组含所有接口) -
?(裸通配符)→ 返回[Object.class],不是空数组
下界 getLowerBounds() 的规则
仅当通配符显式使用 super 时,getLowerBounds() 才返回非空数组;且最多只有一个下界(Java 语法限制不允许多个 super),因此返回数组长度恒为 0 或 1。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
? super Integer→ 返回[Integer.class] -
? extends Number或?→ 返回空数组[] -
? super A & super B是非法语法,编译不通过,不会出现在运行时反射中
遍历建议与常见陷阱
调用这两个方法后,应始终检查数组长度,不可假设非空;尤其注意裸通配符 ? 的上界是 Object 而非“无界”——它有明确上界,只是没写出来。
- 安全遍历上界:
for (Type bound : wildcard.getUpperBounds()) { ... },可直接用,因至少有一个Object - 安全遍历下界:需先判断
if (wildcard.getLowerBounds().length > 0),再取[0]元素 - 不要对返回数组做修改或缓存引用,它是反射内部生成的副本或视图,无规范保证可变性
- 注意
Type可能是Class、ParameterizedType或WildcardType自身(极少见,如嵌套通配符),需按需 instanceof 判断
典型代码片段示意
以下逻辑可用于解析任意 WildcardType:
// 示例:打印通配符的上下界信息
WildcardType wt = ...;
System.out.print("Upper bounds: ");
for (Type t : wt.getUpperBounds()) {
System.out.print(t.getTypeName() + " ");
}
System.out.println();
Type[] lbs = wt.getLowerBounds();
if (lbs.length > 0) {
System.out.println("Lower bound: " + lbs[0].getTypeName());
} else {
System.out.println("No lower bound");
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










