如何关联两个无继承关系的类使其可在抽象类同一方法中使用
解决方案
改造抽象类适配两类响应
你不需要修改Jackson自动生成的两个响应类,直接给抽象父类增加泛型参数即可实现兼容,修改后的代码如下:
// 泛型参数<T>代表当前流程绑定的响应类型,无需两个响应类存在继承/实现关系 abstract class SearchResponseFlow<T> { void execute() { // 从返回结果中拿到响应对象,传入map方法处理 T response = getData().getData(); map(response); } // 抽象方法返回对应类型的包装结果 abstract ResponseWrapper<T> getData(); // 抽象的映射方法,由子类实现对应类型的处理逻辑 abstract void map(T resp); }
两个业务子类只需要指定泛型的具体类型即可,原有业务逻辑不需要改动:
class HomeSearchResponseFlow extends SearchResponseFlow<HomeSearchResponse> { @Override void map(HomeSearchResponse resp) { // 原有住宅搜索响应处理逻辑保持不变 } @Override ResponseWrapper<HomeSearchResponse> getData() { // 原有住宅查询逻辑保持不变 } } class CarSearchResponseFlow extends SearchResponseFlow<CarSearchResponse> { @Override void map(CarSearchResponse resp) { // 原有汽车搜索响应处理逻辑保持不变 } @Override ResponseWrapper<CarSearchResponse> getData() { // 原有汽车查询逻辑保持不变 } }
这个方案的优势是无侵入、类型安全:不需要修改自动生成的响应类,所有类型校验都在编译期完成,不会出现运行期类型转换异常。
外部消费两类响应的方案
根据你的使用场景分为两种处理方式:
- 单独处理某一类响应:直接实例化对应子类,直接获取对应类型的响应对象操作即可:
// 处理住宅搜索业务 HomeSearchResponseFlow homeFlow = new HomeSearchResponseFlow(); homeFlow.execute(); HomeSearchResponse homeResp = homeFlow.getData().getData(); // 直接使用HomeSearchResponse的特有字段做业务处理 // 处理汽车搜索业务 CarSearchResponseFlow carFlow = new CarSearchResponseFlow(); carFlow.execute(); CarSearchResponse carResp = carFlow.getData().getData(); // 直接使用CarSearchResponse的特有字段做业务处理
- 需要统一处理两类响应的公共逻辑(比如统一日志、公共字段统计):
- 如果不希望修改生成类:可以通过反射读取公共字段,或者用Jackson将响应对象转成
JsonNode通用节点,直接读取公共字段值 - 如果允许调整生成逻辑:可以配置Jackson schema生成工具(比如jsonschema2pojo)的自定义接口参数,让两个生成的响应类自动实现你定义的
SearchResponse公共接口,后续就可以统一用接口类型处理公共逻辑,不需要重复编码。
- 如果不希望修改生成类:可以通过反射读取公共字段,或者用Jackson将响应对象转成
内容的提问来源于stack exchange,提问作者xploreraj
相关产品推荐
相关产品推荐

