Discuss / Java / 5.23 重写equals方法作业(IDEA自动生成的)

5.23 重写equals方法作业(IDEA自动生成的)

Topic source

ANGERIED

#1 Created at ... [Delete] [Delete and Lock User]
//给大家看看IDEA自动生成的覆写equals方法,我觉得很规范也很全面

@Overridepublic boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Person1 person1 = (Person1) o;
    return age == person1.age && Objects.equals(firstName, person1.firstName) && Objects.equals(lastName, person1.lastName);
}

@Overridepublic int hashCode() {
    return Objects.hash(firstName, lastName, age);
}

廖雪峰

#2 Created at ... [Delete] [Delete and Lock User]

说实话,建议用instanceof不建议比较class

🌙

#3 Created at ... [Delete] [Delete and Lock User]

老师说的有道理,之前反射的时候好像也说过这个问题

瞬间想起来了

Yue

#4 Created at ... [Delete] [Delete and Lock User]

老师,关于这里不建议比较class有疑惑。详见重写equals方法需要注意的几点 - 走看看 (zoukankan.com)   里面第三点传递性原则部分(同时也违反了对称性原则)的实例。

对于您说的具体的为什么不能比较class的原因还在了解中。这里只是提出来反例一起讨论。

🕶

#5 Created at ... [Delete] [Delete and Lock User]

用instanceof不合理啊,假设集合里存了一个父类一个子类(属性都一样),子类、父类都用instanceof判断重写equals

父类.equals(子类)   子类可以通过instanceof判断且属性值一样(赋一样的值) 返回true

子类.equals(父类)   父类不可以通过instanceof判断 返回false

这不就违反了对称性

使用Class比较,子类就是子类,父类就是父类,关系很明确也很合理,比较两个类是否相等,Class都不一样,那能叫一样吗(个人理解)

廖雪峰

#6 Created at ... [Delete] [Delete and Lock User]

简洁版:

@Override
public boolean equals(Object o) {
    if (o instanceof Person1 person1) {
        return age == person1.age && Objects.equals(firstName, person1.firstName) && Objects.equals(lastName, person1.lastName);
    }
    return false;
}

  • 1

Reply