Java中限制泛型参数类型范围靠类型边界,用extends指定上界(如<T extends Number>),super仅用于通配符下界(如<? super Integer>),不可用于类型参数声明;边界影响类型擦除和方法调用安全。

Java 中限制泛型参数类型范围,靠的是 类型边界(Type Bound),也就是用 extends 或 super 关键字在声明类型参数时指定约束条件。这不是运行时检查,而是在编译期由编译器强制执行的静态规则。
用 extends 限定上界(最常用)
当希望泛型参数只能是某个类或接口的子类型时,使用 extends 指定上界:
-
<T extends Number>:T 只能是Number或其子类(如Integer、Double) -
<T extends Comparable<T>>:T 必须实现Comparable接口,常用于排序逻辑 -
<T extends Runnable & Cloneable>:支持多个接口边界,用&连接,但只能有一个类,且必须写在最前面
用 super 限定下界(多用于通配符)
super 主要出现在通配符中,表示“某个类型的父类或自身”,常见于消费型场景:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
List<? super Integer>:可以接收Integer、Number、Object类型的列表,适合往里写数据 - 注意:
<T super Something>这种写法在类型参数声明中是 非法的 ——super不能用于泛型类/方法的类型参数定义,只适用于通配符
无界与多重边界的擦除规则
类型擦除时,边界直接影响编译后生成的原始类型:
立即学习“Java免费学习笔记(深入)”;
- 无界(如
<T>)→ 擦除为Object - 单上界(如
<T extends List>)→ 擦除为该上界(List) - 多边界(如
<T extends A & B & C>)→ 擦除为第一个类边界;若无类,则擦除为第一个接口(A)
实际使用中的关键提醒
边界不只是语法装饰,它直接决定你能调用哪些方法:
- 声明
<T extends Comparable<T>>后,你就可以在方法体内安全调用t.compareTo(...) - 没有边界时,
T在编译后就是Object,只能调用toString()、equals()等通用方法 - 边界还能防止非法实例化,比如
new Box<StringBuffer>()在Box<T extends StringBuilder>下会直接编译失败

















