Function

Java 中 Function super T, ? extends R> 的签名,不是随意设计的,而是 PECS 原则在函数抽象层面的精准落地——它把“参数可放宽、返回可收窄”推到了逻辑极值。
参数用 ? super T:消费端极致兼容
函数接收的不是“必须是 T”,而是“能装下 T 就行”。只要类型是 T 或其父类(比如 T 是 Integer,Number 或 Object 都合法),就能安全传入。编译器不关心你实际传的是什么父类,只确保 T 可以无损向上转型。
- 一个
Function<number string></number>能处理List<integer></integer>的 map 操作,因为Integer→Number安全 - 写死
Function<integer string></integer>就卡死了——哪怕逻辑完全通用,也无法复用已有的Number→String函数 - 这正是“消费者(Consumer)用 super”的本质:输入越抽象,适配面越广
返回用 ? extends R:产出端极致精确
函数返回的不是“只能是 R”,而是“只要是 R 或其子类就 OK”。调用方拿到结果后,总能安全地当 R 用;而实现方却可以返回更具体的类型(比如 R 是 Number,返回 BigDecimal 或 AtomicInteger 都没问题)。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
-
Optional<integer>.map(x -> new BigDecimal(x))</integer>能顺利编译,因为BigDecimal是Number的子类 - 若限定死返回
Number,你就得手动包装、舍弃子类语义,徒增冗余 - 这正是“生产者(Producer)用 extends”的核心:输出越具体,信息越丰富,调用越灵活
合起来看:不是妥协,而是双向强化
这个泛型签名同时达成两件事:
立即学习“Java免费学习笔记(深入)”;
- 输入侧放开边界——让已有函数能被更多场景复用(宽进)
- 输出侧保留精度——让返回值仍具实际类型意义(窄出)
- 全程不牺牲类型安全:不会把
String当Integer用,也不会往List<integer></integer>里塞Double
Stream.map、Optional.map、RxJava 的 transform 等所有标准转换操作都采用这一模式,因为它在泛型表达力和运行时安全性之间找到了最紧致的平衡点。

















