ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Java 中下限通配符 ? super 怎么限制类型的下界

Java 中下限通配符 ? super 怎么限制类型的下界 ? super T 表示类型至少是T或其父类允许安全写入T及子类对象但读取只能得到Object它用于消费者场景体现PECS原则中的“Consumer Super”。? super T是 Java 泛型中用于限定类型下界的通配符表示“某个未知类型但它至少是T或T的任意父类”。它不指定具体类型而是划出一个**最低兼容门槛**实际类型不能比T更“窄”但可以更“宽”如Object、Number、Serializable等。它怎么限制下界关键在“至少是 T”编译器只保证该泛型结构能安全容纳T类型的对象——因为T可以无条件赋值给它的任何父类型。所以List? super Integer可以引用ArrayListInteger、ArrayListNumber或ArrayListObject但不能引用ArrayListLong或ArrayListString因为它们与Integer没有父子关系这个“下界”不是说类型必须是Integer而是说类型不能低于Integer—— 即不能是Integer的子类Java 中Integer是 final但原理通用为什么只能写入 T不能安全读取为 T因为编译器只知道元素类型 ≥T但不知道具体是什么。比如List? super Animal可能是ListAnimal也可能是ListObject甚至ListSerializable如果Animal实现了它。所以add(new Dog())✅ 安全任何Dog都可赋给Animal、Object、Serializableget(0)→ 返回类型是Object只能赋给Object或其父类实际几乎总是ObjectAnimal a list.get(0);❌ 编译失败无法保证返回的是Animal万一底层是ListObject里面存了String呢典型使用场景消费者Consumer操作它天然适配“往里塞数据”的需求尤其在工具方法中提升复用性public static T void copy(List? extends T src, List? super T dest)源列表生产T目标列表消费Tpublic static T void addAll(List? super T list, T... items)向任意足够“宽”的容器添加T实例传入ArrayListObject、LinkedListAnimal、StackSerializable都合法只要它们能装下T和 ? extends T 的核心区别二者服务于相反角色不可互换? extends T上界通配符“最多是T”适合读取Producer不能安全写入除null? super T下界通配符“至少是T”适合写入Consumer读取只能得Object这就是 PECS 原则Producer-ExtendsConsumer-Super
返回列表