策略模式中用泛型约束输入类型,通过泛型接口定义统一契约,上界约束确保能力前提,上下文泛型透传类型,双泛型支持主辅数据关联,全程编译期类型安全。

在策略模式中用泛型约束不同策略的数据输入,核心是让策略接口或抽象类携带类型参数,把“输入数据的类型”作为契约的一部分固定下来。这样每个具体策略实现时,必须明确它能处理什么类型的数据,编译器会强制检查传入参数是否匹配,避免运行时类型错误。
用泛型接口定义统一输入契约
策略接口本身声明一个类型参数 T,并将该类型用于方法参数。所有实现类都需指定具体的 T,从而天然绑定其输入类型。
- 接口定义:public interface DataProcessor
{ void process(T data); } - 具体实现:class JsonProcessor implements DataProcessor
{ public void process(String json) { ... } } - 另一个实现:class UserProcessor implements DataProcessor
{ public void process(User user) { ... } } - 调用时类型安全:processor.process(new User()) —— 若传 "abc" 会编译失败
通过上界约束输入必须具备某种能力
如果多个策略都需要对输入做相同操作(如比较、序列化、校验),可在泛型参数上加 extends 边界,确保输入类型满足前提条件。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 要求输入可比较:interface SortStrategy
> { T[] sort(T[] array); } - 要求输入可序列化:interface Exporter
{ byte[] export(T item); } - 这样 new SortStrategy
() 合法,但 new SortStrategy 编译不通过
上下文类用泛型保持输入类型一致性
策略上下文(Context)不硬编码某一种策略,而是用泛型接收并转发输入,让类型从调用处一路透传到底层策略,避免擦除和强制转换。
- class ProcessingContext
{ private DataProcessor strategy; public void execute(T input) { strategy.process(input); } } - 使用时:var ctx = new ProcessingContext
(); ctx.setStrategy(new BigDecimalCalculator()); ctx.execute(new BigDecimal("123.45")); - 整个链路中 T 是同一个具体类型,编译器全程跟踪校验
支持多输入类型但共享逻辑结构
当策略需要同时处理主数据和辅助数据(如主对象 + 配置对象),可用双泛型参数,并通过边界建立关联,确保二者兼容。
- interface RuleEngine
> { boolean matches(T target, C config); } - 其中 RuleConfig
是泛型配置类,表示“该配置专为类型 T 设计” - 实现类如 AgeRuleEngine implements RuleEngine
,AgeConfig extends RuleConfig - 这种写法既允许不同类型策略共存,又防止传错配置(比如把 OrderConfig 传给 User 策略)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










