如何在子类中使用通用父类的 equals 和 hashcode?

问题描述 投票:0回答:1

我的项目中有很多实体类,并且不覆盖每个实体类中的 equals 和 hashcode,我想从实现这些方法的父类扩展它。因为实体类 equals 和 hashcode 应该基于其 ID 字段,因为它对于每个实例都是唯一的。

@NoArgsConstructor
@Getter
@Setter
public abstract class ParentEntity<ID> {

    private ID id;

   
    @Override
    public boolean equals(final Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        ParentEntity<?> that = (ParentEntity<?>) o;
        return Objects.equals(id, that.id);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }
}
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class ChildEntity extends ParentEntity<Long> {

    private Long id;

    private String name;


}

但是当我测试它时:

ChildEntity childEntity = new ChildEntity(4L, "Cheese");
ChildEntity childEntity1 = new ChildEntity(4L, "Bread");
ChildEntity childEntity2 = new ChildEntity(1L, "Milk");

System.out.println(childEntity.equals(childEntity1)); // output true
System.out.println(childEntity.equals(childEntity2)); // output true

在调试中,我看到每个子实体实例中的 ParentEntity.id 均为 null,但我不明白为什么会这样。 请帮忙

java inheritance equals hashcode
1个回答
0
投票

如果子类中确实需要

private Long id;
,请将其命名为其他名称,而不是与超类中的另一个字段同名。

© www.soinside.com 2019 - 2024. All rights reserved.