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

发布时间:2026/10/2 6:54:29
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

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询