java泛型通过extends(上界)和super(下界)限定类型边界:extends用于类/方法声明及通配符,表示“某类型或其子类/实现接口”,支持单/多上界(类须首位);super仅用于通配符,表示“某类型或其父类”,适用于写入场景。

Java 中限制泛型类型边界,主要靠 extends(上界)和 super(下界)两个关键字,分别用于声明类型参数或通配符的合法取值范围。核心目标是让编译器能在编译期验证类型安全,同时允许调用边界类型定义的方法。
用 extends 限定上界(最常用)
适用于泛型类、方法或通配符,表示“只能是某类或其子类”“或实现某接口”。这里的 extends 是广义的,既支持继承类,也支持实现接口。
- 单上界写法:
<t extends number></t>—— T 只能是Number或IntegerDouble等子类 - 多上界写法:
<t extends date serializable cloneable></t>—— 类必须排第一位,且只能有一个;接口顺序不限 - 泛型方法中使用:
public <u extends comparable>> int compare(U a, U b)</u>,可安全调用a.compareTo(b) - 通配符上界:
List extends Number>—— 可读不可写(除null),遍历时元素类型视为Number
用 super 限定下界(写入场景)
仅用于通配符(? super T),表示“只能是 T 或其父类”,常用于向集合添加元素。
- 写入安全:
List super Integer>可接收ArrayList<number></number>或ArrayList<object></object>,允许add(new Integer(42)) - 读取受限:从
? super Integer中取元素,类型只能是Object(最宽上界),无法直接当Integer用 - 不能用于泛型类/方法声明:
<t super number></t>是非法语法
边界与类型擦除的关系
泛型在运行时会被擦除,但边界信息保留并影响擦除结果:
- 无界泛型
<t></t>擦除为Object - 有界泛型
<t extends number></t>擦除为Number - 多边界
<t extends a b></t>擦除为第一个类A(若无类则为第一个接口) - 这意味着:擦除后仍能调用
Number的方法,但无法获取原始泛型类型(如Integer)
常见误用与注意事项
边界看似简单,但几个细节容易出错:
-
String是 final 类,List extends String>合法但只能匹配List<string></string>,且依然禁止add() - 不能用
instanceof检查泛型类型:list instanceof List<string></string>编译失败,应改用List> - 无法创建泛型数组:
new T[10]报错;需用(T[]) new Object[10]或反射绕过 - 上界通配符不支持添加(除
null),下界通配符不支持精确读取——这是 PECS 原则(Producer Extends, Consumer Super)的体现
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











