Java泛型边界(extends和super)是框架设计中控制抽象粒度、保障类型安全、支撑可扩展性的关键机制:上界用于只读统一抽象,下界用于写入兼容注入,通配符桥接多版本模型,边界配合策略模式实现差异化逻辑处理。

Java 泛型边界(extends 和 super)在框架设计中不是语法装饰,而是控制抽象粒度、保障类型安全、支撑可扩展性的关键杠杆。用对了,能让框架既松耦合又强约束;用错了,容易导致泛型失效、运行时转型或 API 难以复用。
上界限定(? extends T)用于只读场景的统一抽象
当框架需要接收多种子类型但只做“读取+计算”操作时,上界限定能收拢行为、避免类型爆炸。
- 比如日志收集器要兼容
LogEventV1、LogEventV2、LogEventV3,它们都实现Loggable接口(含getTimestamp()、getLevel()),但字段和构造方式不同 - 框架方法定义为
public <t extends loggable> void batchProcess(List<t> events)</t></t>,内部只能调用Loggable声明的方法,天然屏蔽实现差异 - 若写成
List<object></object>或List>,就得靠instanceof+ 强转,破坏编译期检查,也违背开闭原则
下界限定(? super T)用于写入兼容的通用注入点
框架常提供“向容器注册/添加”的能力,要求能接受目标类型及其所有父类型——这时下界是唯一安全选择。
- 例如事件总线的
publish(Event e)方法,若想支持publish(new UserLoginEvent())同时也能塞进List<event></event>或List<object></object>,签名应为public static <t> void addToQueue(Queue super T> queue, T item)</t> - 这样调用方传
LinkedList<event></event>、ArrayDeque<object></object>都合法;但若用Queue<event></event>,就无法接收Object类型队列 - 注意:下界中读取元素只能按
Object处理,这是类型安全的代价,也是设计意图——写入开放,读取保守
通配符桥接与适配层解耦多版本模型
面对历史包袱(如老系统接口返回 Map<string object></string>,新模块用 Record 或 DTO),通配符配合轻量视图接口可隔离变化。
立即学习“Java免费学习笔记(深入)”;
- 定义统一视图
interface OrderView { BigDecimal getTotal(); boolean isPaid(); } - 各版本模型提供
asView()方法,返回该接口实例(无需修改原有类结构) - 风控、计费等核心服务只依赖
List extends OrderView>,新增 V4 版本只需补一个OrderV4.asView()实现,主流程零改动 - 比泛型类继承树更轻量,比反射+字符串取值更类型安全
泛型处理器 + 工厂注册应对差异化逻辑
当某些类型需特殊处理(如 V3 模型带 AI 分数字段,V1/V2 没有),但主流程必须保持一致时,边界配合策略模式最稳妥。
- 声明处理器接口:
interface Handler<t extends basedomain> { void handle(T domain); }</t> - V1Handler 实现
Handler<orderv1></orderv1>,V3Handler 实现Handler<orderv3></orderv3>,各自处理自己能理解的字段 - 工厂根据
domain.getClass()查找匹配的Handler super BaseDomain>,确保能覆盖所有子类 - 边界在这里起两个作用:一是约束处理器只处理合法子类型(
extends BaseDomain),二是让工厂注册表能容纳不同具体类型的处理器(用Handler>或通配符集合管理)


















