下界(? super t)是为了支持更灵活的比较器复用,使父类型比较器能用于子类型列表;例如comparator可直接排序list,因dog extends animal,且comparator是消费者,遵循pecs原则。

Java 中 Collections.sort(List<t> list, Comparator super T> c)</t> 的下界(? super T)是为了支持**更灵活的比较器复用**,让一个能处理父类型的比较器也能用于子类型列表。关键不是“怎么用下界”,而是理解它为什么存在、什么时候能受益。
下界允许父类比较器用于子类列表
比如你有一个 List<dog></dog>,而你恰好有一个 Comparator<animal></animal>(因为 Dog extends Animal),那么这个比较器可以直接传给 sort()——这正是 ? super T 所允许的:
-
T是Dog -
? super Dog包含Dog、Animal、Object等 - 所以
Comparator<animal></animal>符合类型约束
写比较器时,用父类型参数更通用
定义比较器时,如果逻辑只依赖于公共父类(如 name 字段在 Animal 中),就应声明为 Comparator<animal></animal> 而非 Comparator<dog></dog>:
Comparator<animal> byName = (a1, a2) -> a1.getName().compareTo(a2.getName());</animal>
这样它就能安全用于 List<dog></dog>、List<cat></cat>、List<animal></animal> 等所有子类型列表。
不能用上界(? extends T)的原因
如果写成 Comparator extends T>,那意味着比较器只能处理 T 或其子类,但排序时需要把两个 T 实例交给比较器——而一个只接受 Dog 的比较器无法安全比较两个 Animal(可能不是 Dog)。下界保证了“输入兼容性”:比较器至少能接收 T 类型的对象。
实际调用中你几乎不用写 ? super
泛型类型由编译器自动推断。你只需传入合法的比较器,编译器会检查是否满足 ? super T:
- ✅
Collections.sort(dogs, byName);// byName 是Comparator<animal></animal>,OK - ❌
Collections.sort(dogs, byBreed);// byBreed 是Comparator<dog></dog>,也 OK(Dog是super Dog) - ❌
Collections.sort(dogs, (Dog d1, Cat d2) -> 0);// 类型不匹配,编译失败
super。Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











