泛型上限(? extends t)用于安全读取子类型数据并限制写入,解决泛型不变性导致的多态失效问题;它允许将arraylist等传入arraylist

Java 泛型上限(T extends UpperBound)在多态集合中主要用于**安全地读取子类型数据,同时限制写入操作**,解决“ArrayList
为什么需要泛型上限?
数组支持协变(Dog[] 可赋给 Animal[]),但泛型是不变的——ArrayList<dog></dog> 和 ArrayList<animal></animal> 没有继承关系。直接赋值编译失败。泛型上限通过通配符 ? extends Animal 建立“只读视角”的兼容性。
上限通配符 ? extends T 的核心用法
声明形如 ArrayList extends Animal> 的引用,表示该集合元素类型是 Animal 或其任意子类(如 Dog、Cat),但具体是哪一个在编译期未知。
- ✅ 可以安全读取:取出来的元素可向上转型为
Animal(因为所有子类都 IS-A Animal) - ❌ 不能添加任何具体对象(包括
new Animal()、new Dog()):编译器无法保证类型安全,例如集合实际是ArrayList<cat></cat>,却往里加Dog - ✅ 可以传入
ArrayList<dog></dog>、ArrayList<cat></cat>、ArrayList<animal></animal>等任何匹配上限的实例
典型应用场景示例
假设你有一个处理动物列表的工具方法,只读不改:
public void printAnimals(ArrayList extends Animal> animals) {
for (Animal a : animals) { // 编译通过:a 是 Animal 类型
System.out.println(a.getName());
}
// animals.add(new Dog()); // 编译错误:禁止写入
}
调用时完全自由:
printAnimals(new ArrayList<dog>());</dog>printAnimals(new ArrayList<cat>());</cat>printAnimals(new ArrayList<animal>());</animal>
与下限 ? super T 的区别要点
上限(? extends T)侧重“读取安全”,适合消费者场景;下限(? super T)侧重“写入安全”,适合生产者场景。两者合称 PECS 原则(Producer Extends, Consumer Super)。
- 你要从集合里取东西当 T 用 → 用
? extends T - 你要往集合里放 T 及其子类 → 用
? super T
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











