泛型是责任链模式中保障类型安全与可维护性的关键设计,通过约束请求与处理器的匹配关系,使每个节点仅处理特定类型请求,避免运行时类型转换错误和object模糊传递。

泛型在责任链模式中不是可选项,而是让链真正安全、可维护的关键设计。它解决的核心问题是:每个节点只该处理自己能理解的请求类型,避免运行时类型转换错误和模糊的 Object 传递。
用泛型约束请求与处理器的匹配关系
抽象处理者应声明两个泛型参数:T 表示能处理的请求类型,R 表示处理结果类型(可选)。这样每个具体处理器在编译期就绑定自己的输入契约:
- 抽象类定义为
abstract class Handler<t r></t>,其中handleRequest(T request)方法明确限定入参类型 - 子类继承时必须指定具体类型,例如
AuthHandler extends Handler<authrequest boolean></authrequest>或ApprovalHandler extends Handler<approvalrequest approvalresult></approvalrequest> - next 引用也需泛型化:
protected Handler<t r> next;</t>,保证整条链处理的是同一类请求
请求对象本身也建议泛型化或分层建模
不推荐所有节点共用一个宽泛的 Request 类并靠字段判断分支。更规范的做法是:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 定义顶层标记接口
interface Request {},各业务请求实现它,如class AuthRequest implements Request、class PaymentRequest implements Request - 若需统一入口,可用泛型工厂或策略路由先分发到对应责任链,而不是把所有请求塞进同一条链
- 避免在
handleRequest()中写if (request instanceof X) {...}—— 这是泛型没用到位的信号
链组装时保持类型一致性
客户端构建链时,类型信息必须贯穿始终:
- 使用 Fluent API 组装时,
setNext()方法应返回Handler<t r></t>,而非原始类型,确保链上所有节点类型兼容 - 若采用 List 存储处理器(用于动态插拔),应声明为
List<handler super t extends r>></handler>或更严格地用类型令牌校验运行时类型 - 终结节点(如兜底的 DefaultHandler)也要适配泛型,例如
DefaultHandler<t> extends Handler<t void></t></t>,不能用裸类型破坏链完整性
避免常见泛型误用
泛型带来安全的同时,也容易因擦除或边界不当引发问题:
- 不要在抽象基类中用
Handler, ?>做 next 引用 —— 它会丢失类型信息,导致子类无法安全调用next.handleRequest(request) - 慎用通配符上界(
? extends T)做入参,除非你明确需要协变;多数场景下直接用T更清晰可控 - 泛型不能用于静态方法或静态字段,所以类型检查逻辑不要放在 static 工具方法里,而应融入实例处理流程
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










