Java中多态与泛型协同的核心是分层设计:泛型固化类型契约,多态解耦行为实现;通过泛型接口、抽象模板类、通配符与泛型方法结合,兼顾类型安全与运行时灵活性,规避类型擦除陷阱。

Java 中多态与泛型配合,核心目标是让同一套调用逻辑能安全、灵活地处理多种类型,同时避免运行时类型错误。关键不在于“堆砌特性”,而在于分层设计:用泛型固化类型契约,用多态解耦行为实现。
用泛型接口定义统一契约,子类按需特化
接口声明泛型参数,强制实现类明确处理的具体类型;调用方只依赖接口,不感知具体实现——这是泛型+多态协同的起点。
- 定义 DataHandler
接口,含 handle(T data)和T transform(T input)方法 -
JsonHandler 实现
DataHandler<string></string>,专注 JSON 字符串解析 -
NumberNormalizer 实现
DataHandler<double></double>,负责浮点数归一化 - 业务代码中统一使用
DataHandler>引用或List<datahandler>></datahandler>容器,通过handler.handle(data)调用,无需 if-else 判断类型
抽象基类封装通用流程,子类注入类型专属逻辑
在抽象类上声明泛型参数,把不变的流程(如日志、重试、状态流转)写死,把可变的策略(如校验规则、序列化方式)留给子类实现。
- 定义 abstract class ServiceProcessor
,含 public final T execute(T input)(模板方法),内部调用抽象方法protected abstract T doProcess(T input) - 子类 UserSyncProcessor extends ServiceProcessor
只需实现 doProcess,自动获得统一的异常包装、耗时统计等能力 - 泛型确保
execute输入输出类型严格一致,避免子类意外返回错误类型
通配符 + 泛型方法提升集合操作的灵活性
当需要统一处理不同泛型类型的实例时,不能直接用 DataHandler<string></string> 和 DataHandler<integer></integer> 的父类(它们没有公共泛型父类),此时靠通配符和泛型方法破局。
立即学习“Java免费学习笔记(深入)”;
- 声明方法
<t> void batchExecute(List<datahandler>> handlers, T data)</datahandler></t>,编译器自动推断 T - 对异构处理器集合,用
List<datahandler>></datahandler>存储,配合泛型工具方法:public static <t> T safeHandle(DataHandler super T> handler, T data)</t> - 注意:
? super T允许传入更宽泛的处理器(如DataHandler<object></object>处理String),? extends T适用于只读场景(如从List extends Number>读取值)
规避类型擦除陷阱,保障运行时必要类型信息
泛型在运行时被擦除,但某些场景(如 JSON 反序列化、动态代理)需要真实类型。这时需主动传递 Class<t></t> 或使用 TypeReference。
- 抽象类构造器接收
Class<t> type</t>,存为字段,用于反射创建实例或 Gson 解析:gson.fromJson(json, type) - 避免在泛型类中写
if (data instanceof String)—— 这种判断在擦除后永远为 true(因为实际是 Object) - 若需类型分支逻辑,改用策略模式:将类型判断前置,生成对应
Handler<t></t>实例,后续全程走泛型多态调用


















