泛型方法的核心价值是让同一逻辑安全适配多类型并提前类型约束至编译期;需依场景选用上界(extends)收拢操作、下界(super)提升写入兼容性、通配符桥接接口差异,配合适配层与泛型处理器实现可扩展解耦。

泛型方法的核心价值不是“写得更短”,而是让同一段逻辑能安全适配多个类型,同时把类型约束提前到编译期。关键不在语法怎么写,而在于什么时候该用上界、什么时候该用下界、什么时候必须加通配符。
需要复用校验或转换逻辑时,用上界限定(extends)收拢操作范围
当多个业务模型共享部分行为(比如都带价格、库存、状态),但各自是不同类(ProductV1、ProductV2、ProductV3),通用方法不该绑定具体子类。
- 定义统一基类或接口,如 interface Validatable { boolean isValid(); } 或 abstract class BaseProduct { BigDecimal getPrice(); }
- 泛型方法声明为 public <T extends Validatable> void check(T item) —— 编译器只允许调用 isValid(),但所有实现类都能传进来
- 避免写 public void check(Object obj) 再手动强转,既不安全又绕过类型检查
向集合批量写入数据时,用下界限定(super)提升兼容性
当你设计一个“往列表里加数据”的工具方法,希望它既能加 Integer,也能加 Number 或 Object 类型的列表,就得用 super。
- 方法签名应为 public static void addIntegers(List<? super Integer> list, int... values)
- 这样可接受 List<Integer>、List<Number>、List<Object>,但不能接受 List<String>
- 注意:读取时只能按 Object 接收,因为下界不确定具体上层类型
对接口抽象程度不一时,用通配符桥接版本差异
不同版本模型字段名、getter 不一致,但语义一致(如“是否上架”可能是 isOnline()、getPublished()、getStatus() == 1)。这时靠适配层解耦。
立即学习“Java免费学习笔记(深入)”;
- 定义轻量视图接口:interface ProductView { boolean isOnSale(); BigDecimal getFinalPrice(); }
- 各版本模型提供 asView() 方法,返回该接口实现
- 所有促销计算、风控规则等公共逻辑,只面向 ProductView 编程,新增版本只需补一个 asView() 实现
需按版本定制处理但又要保持主流程干净时,用泛型处理器 + 工厂注册
不是所有逻辑都能完全通用。比如 V3 新增 AI 评分字段,V1/V2 没有,但主校验流程不能因此塞一堆 if-else。
- 定义泛型处理器:interface ProductHandler<T extends BaseProduct> { void handle(T product); }
- 为每个版本写实现类:V3Handler implements ProductHandler<ProductV3>
- 工厂维护 Map<Class<?>, ProductHandler<?>>,运行时用 product.getClass() 查找并调用
- 新增版本只需加实现类 + 注册,不碰原有通用代码


















