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

为何KA类equals始终返回true?如何恢复Object默认地址比较?

问题根源

父类A使用了Lombok的@Data注解,该注解默认包含@EqualsAndHashCode,会自动生成**仅基于父类字段myEnum**的equals方法。子类KA未显式定义equals方法,也未添加@EqualsAndHashCode注解,因此直接继承了父类A生成的equals逻辑:

  • 无参构造创建实例时,所有实例的myEnum字段都是null,因此equals返回true;
  • 即使子类字段(pck、field1、field2)完全不同,父类生成的equals不会考虑子类字段,依然返回true。
解决方案

要让KA使用Object默认的基于内存地址的equals方法,有两种可行方式:

方式一:修改父类A的注解

去掉父类的@Data注解,替换为更精细的Lombok注解,避免自动生成equals和hashCode:

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
public abstract class A {
    private Enum myEnum;
}

此时父类和子类都会默认使用Object的equals方法,基于内存地址比较。

方式二:子类KA显式重写equals和hashCode

如果父类必须保留@Data,可以在子类KA中直接重写方法,调用Object的默认实现:

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
public class KA extends A {
    private MyPackage pck;
    private String field1;
    private String field2;

    @Override
    public boolean equals(Object obj) {
        return super.equals(obj); // 调用Object的equals,基于内存地址比较
    }

    @Override
    public int hashCode() {
        return super.hashCode(); // 对应Object的hashCode,基于内存地址生成
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 07:17:36