Java泛型类通过上界限定(extends)限制类型范围,编译期强制约束T必须是某类或接口的子类型,支持单上界<T extends SomeType>和多重上界<T extends A & B>,不可用super;本质是契约而非过滤。

Java 泛型类定义时限制数据类型范围,核心是使用 上界限定(extends),在泛型参数声明处指定其必须是某个类或接口的子类型。这不是“运行时检查”,而是编译期强制约束——不符合范围的类型无法通过编译。
用 extends 指定单一上界
这是最常用方式。语法为 <T extends SomeType>,表示 T 只能是 SomeType 或其子类/实现类。
-
SomeType可以是具体类(如Number、Exception),也可以是接口(如Comparable、Runnable) - 擦除后,
T被替换为该上界类型,保障运行时方法签名兼容
示例:
public class NumberBox<T extends Number> {private T value;
public double getValueAsDouble() { return value.doubleValue(); } // 编译器知道 value 有 doubleValue()
}
→ 允许:
NumberBox<Integer>、NumberBox<BigDecimal>→ 不允许:
NumberBox<String>(编译报错)
用 & 指定多重上界
当需要类型同时满足多个约束时,用 & 连接多个接口(最多一个类,且必须写在最前):
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
立即学习“Java免费学习笔记(深入)”;
public class SortedCloneableBox<T extends Comparable<?> & Cloneable> {private T item;
public void process() {
item.compareTo(null); // 可调用 Comparable 方法
item.clone(); // 可调用 Cloneable 方法(需处理异常)
}
}
→ 擦除后,
T 变为第一个上界 Comparable,但编译器仍校验是否同时实现 Cloneable
不能用 super 限制泛型类本身
super 仅用于通配符(如 List<? super Integer>),**不可用于泛型类或泛型方法的类型参数声明**:
-
class Box<T super Number>→ 语法错误,编译不通过 - 下界逻辑只适用于消费者场景(如方法参数),由通配符承载,而非泛型类定义本身
限制不是“过滤”,而是“契约”
限制类型范围的目的不是阻止用户传参,而是向编译器和调用者明确表达设计意图:
- 保证泛型类内部可安全调用上界类型的方法(如
Number.doubleValue()) - 避免无意义的泛型实例(如用
String做数学运算的NumberBox) - 让 API 更自文档化:看到
<T extends Serializable>就知道这个类要序列化

















