Java继承父类时如何在子类接口中使用不同的泛型
问题本质
Java泛型有擦除机制,不允许同一个类实现ParameterizedPayment接口的两种不同参数化版本。你当前的父类已经硬编码实现了ParameterizedPayment<BaitushumAdapter.Parameters>,子类再尝试实现ParameterizedPayment<JskkBaitushumAdapter.Parameters>会被判定为重复实现接口,方法签名冲突,编译不通过。
解决方案(最优)
调整父类的泛型定义,将ParameterizedPayment的参数类型提取为父类的泛型参数,允许子类自定义传入对应的Parameters类型:
步骤1:改造父类泛型结构
// 新增第二个泛型参数P,上限设置为BaitushumAdapter.Parameters,兼容所有派生的Parameters子类 public class BaitushumAKBARSCard2AccountSchema<C extends BaitushumAKBARSCard2AccountSchema.Config, P extends BaitushumAdapter.Parameters> extends AKBARSCard2AccountSchema<C> implements ParameterizedPayment<P> { private P parameters; @Override public void setParameters(P parameters) { this.parameters = parameters; } }
如果现有业务中存在大量直接使用原父类的场景,可以额外加一层默认实现类兼容旧逻辑,避免原有代码报错:
// 原有逻辑的兼容实现,默认使用BaitushumAdapter.Parameters public class CommonBaitushumAKBARSCard2AccountSchema<C extends BaitushumAKBARSCard2AccountSchema.Config> extends BaitushumAKBARSCard2AccountSchema<C, BaitushumAdapter.Parameters> { }
步骤2:子类继承改造后的父类
直接传入自定义的JskkBaitushumAdapter.Parameters作为泛型参数即可,不需要重复声明接口:
public class JskkBaitushumAKBARSCard2AccountSchema extends BaitushumAKBARSCard2AccountSchema<JskkBaitushumAKBARSCard2AccountSchema.Config, JskkBaitushumAdapter.Parameters> { // 父类已经实现了泛型化的setParameters,如有特殊业务可以直接重写 @Override public void setParameters(JskkBaitushumAdapter.Parameters parameters) { // 自定义业务逻辑 super.setParameters(parameters); } }
兜底方案(不推荐,仅当无法修改父类时使用)
如果父类不允许修改,子类不要重复实现ParameterizedPayment接口,直接重写方法时做类型校验和转换:
public class JskkBaitushumAKBARSCard2AccountSchema extends BaitushumAKBARSCard2AccountSchema<JskkBaitushumAKBARSCard2AccountSchema.Config> { private JskkBaitushumAdapter.Parameters parameters; @Override public void setParameters(BaitushumAdapter.Parameters parameters) { if (!(parameters instanceof JskkBaitushumAdapter.Parameters)) { throw new IllegalArgumentException("仅支持传入JskkBaitushumAdapter.Parameters类型参数"); } this.parameters = (JskkBaitushumAdapter.Parameters) parameters; } }
内容的提问来源于stack exchange,提问作者user14384473
相关产品推荐
相关产品推荐

