You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

继承抽象类的子类如何实现equals方法?父类含Id字段场景

正确实现继承抽象类的JPA子类equals方法

错误原因分析

你遇到的编译错误是因为原代码误用了id字段和getId()方法——抽象类Car中定义的主键字段是taskId,Lombok的@Getter注解会为其生成getTaskId()方法,而非getId(),子类ChangeTyre继承了父类的方法,但不存在id字段和getId()方法,因此编译器报错。

基础修正后的equals实现

直接调用父类继承来的getTaskId()方法获取主键进行比较即可:

@Override
public boolean equals(Object o) {
    // 引用相同直接返回true
    if (this == o) return true;
    // 类型不匹配返回false
    if (!(o instanceof ChangeTyre)) return false;
    
    ChangeTyre other = (ChangeTyre) o;
    
    // 利用父类的getTaskId()方法比较主键
    return getTaskId() != null && getTaskId().equals(other.getTaskId());
}

JPA实体场景下的进阶实现

由于这是JPA实体,需要考虑实体未持久化时主键未生成的情况(新创建的实体还未存入数据库,taskId为null),此时可以结合业务唯一键(比如ChangeTyre中标注为unique = true的code字段)实现更健壮的equals逻辑:

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof ChangeTyre)) return false;
    
    ChangeTyre other = (ChangeTyre) o;
    
    // 主键存在时优先用主键比较
    if (getTaskId() != null && other.getTaskId() != null) {
        return getTaskId().equals(other.getTaskId());
    }
    
    // 主键不存在时,用业务唯一键code比较
    return getCode() != null && getCode().equals(other.getCode());
}

配套重写hashCode方法

根据Java规范,equals和hashCode的逻辑必须保持一致,否则会导致HashMap、HashSet等集合出现异常行为。对应上面的进阶实现,hashCode可以这样写:

@Override
public int hashCode() {
    // 主键存在时用主键生成哈希值,否则用业务唯一键,最后 fallback 到父类哈希
    return getTaskId() != null ? getTaskId().hashCode() : 
           (getCode() != null ? getCode().hashCode() : super.hashCode());
}

内容的提问来源于stack exchange,提问作者Ray Bond

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 23:45:27