author
type
status
date
slug
summary
tags
category
icon
password
在Java泛型中,上下界限定符(<? extends T><? super T>)用于约束泛型类型的范围,增强类型安全性,同时解决泛型类型的灵活性问题。以下通过具体场景和示例解释它们的核心区别和应用。

1. 上界限定符 <? extends T>(生产者模式)

含义
表示泛型类型必须是 T 或其子类,即“上限是T”。
用途
只读场景:从泛型对象中安全读取数据。 • 不能写入:因为无法确定具体子类型(可能破坏类型安全)。

示例1:读取数据

关键点
sum 方法可以接受 List<Integer>List<Double>,因为它们的元素都是 Number 的子类。 • 不能添加元素list.add(100) 会编译错误,因为实际类型可能是 Double,而 100Integer

2. 下界限定符 <? super T>(消费者模式)

含义
表示泛型类型必须是 T 或其父类,即“下限是T”。
用途
只写场景:向泛型对象安全写入数据。 • 可以读取:但读取时类型会被视为 Object(需强制转换)。

示例2:写入数据

关键点
addIntegers 可以向 List<Number>List<Object> 添加 Integer,因为 Integer 是它们的子类。 • 可以读取为ObjectObject obj = list.get(0) 是允许的,但可能需要强制转换。

3. PECS原则(Producer-Extends, Consumer-Super)

这是使用上下界限定符的核心原则:
Producer(生产者):产生数据的对象(如从集合读取数据),使用 <? extends T>
Consumer(消费者):消费数据的对象(如向集合写入数据),使用 <? super T>

示例3:结合PECS的通用方法

说明
src 使用 extends 保证读取安全,dest 使用 super 保证写入安全。

4. 常见误区与解答

误区1:List<? extends Number>List<Number> 的区别

  • List<? extends Number> 是“某种Number子类的List”,而 List<Number> 是“明确为Number的List”。

误区2:<? super T> 不支持读取


总结

限定符
应用场景
读写规则
<? extends T>
生产者(读取数据)
只读,不能写入(除null
<? super T>
消费者(写入数据)
可写入,读取为Object
核心思想
extends 放宽读取限制,确保读取的数据类型统一。
super 放宽写入限制,确保写入的数据类型符合要求。
 
 
示例文章,调试站点可支持全部Notion组件的显示效果代理模式:像「明星经纪人」一样管理我的对象
Loading...
Sean Liu
Sean Liu
Stack the Code, Hack the World.
最新发布
Java泛型:PECS原则与Java中泛型的上下界限定符
2025-4-10
代理模式:像「明星经纪人」一样管理我的对象
2025-4-10
加锁文章,调试文章加密功能「默认密码:123456」
2025-4-7
示例文章,调试站点可支持全部Notion组件的显示效果
2025-4-7
依赖倒置:让高层模块不再被「底层牵制」的解耦之道
2025-4-7
开源OCRmyPDF实战:让扫描文档重获新生的技术魔法
2025-4-1
公告
 
We can only see a short distance ahead, but we can see plenty there that needs to be done.
目光所及之处,只是不远的前方,但那里已有太多值得去做的事在等待着我们。
 
—— Alan Turing 阿兰 · 图灵