通配符边界限定需通过泛型上界(如)收拢操作范围,结合ProductView适配接口、泛型处理器与工厂策略实现版本解耦,避免运行时类型擦除陷阱。

通配符边界限定不是加个 extends T>就完事,关键在如何用它把多版本模型的公共操作“稳住”,让新增版本不碰老逻辑、不改通用方法。
明确泛型上界,收拢可操作范围
当商品模型从ProductV1升级到ProductV2、ProductV3,它们都继承自统一基类BaseProduct,这时通用校验、组装、序列化逻辑就不该绑定具体子类。定义泛型方法时直接限定上界:
-
public <t extends baseproduct> void validate(T product)</t>—— 所有版本产品都能进,但只能调用BaseProduct里声明的方法 - 避免写
public void validate(Object obj)再强转,也拒绝用ProductV1硬编码去适配后续版本 - 上界越抽象、越稳定(比如用接口
Validatable代替具体类),未来扩展性越强
用泛型桥接层隔离版本差异
不同版本模型字段名、结构可能不同,但核心语义一致(如“价格”“库存”“上架状态”)。此时可设计一个轻量适配接口:
- 定义
interface ProductView { BigDecimal getPrice(); Integer getStock(); boolean isOnline(); } - 每个版本模型提供自己的
asView()实现:ProductV2::asView返回封装后的ProductView实例 - 所有公共逻辑(比如促销计算、库存预警)只面向
ProductView编程,彻底与版本解耦
配合工厂+泛型方法,自动路由到对应处理逻辑
不是所有逻辑都能完全通用,部分动作仍需按版本定制(如V3新增了AI评分字段,V1没有)。这时用泛型限定配合策略注册:
- 定义泛型处理器接口:
interface ProductHandler<t extends baseproduct> { void handle(T product); }</t> - 为每个版本实现:例如
V3Handler implements ProductHandler<productv3></productv3> - 工厂类维护
Map<class>, ProductHandler>></class>,但实际取用时通过handlerMap.get(product.getClass()).handle(product)完成类型安全调用 - 新增
ProductV4只需加实现类+注册,零改动已有代码
避免常见陷阱:擦除后类型检查失效
泛型在运行时被擦除,不能直接用if (T == ProductV2.class)判断。真正需要区分版本时,应:
- 靠对象实例的
getClass()判断,而非泛型参数 - 不在泛型方法内部做“针对某版本特殊处理”的分支,那会污染通用性
- 若必须分支,提取成独立的
VersionSpecificLogic类,由外部传入,保持主流程干净

















