为何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
相关产品推荐
相关产品推荐

