为什么我们要在 Java 中以 Object 作为参数编写 equals 方法?

Why would we write equals method in Java with Object as argument?

我正在学习 Java 的课程,并且经常在新的 classes 中定义 equals 方法时,它的参数是 Object 而不是实际类型的 class。代码示例:

public class TestClass {
    String label, value;
    public TestClass(String label, String value) {
        this.label = label;
        this.value = value;
    }

    public boolean equals(Object o) {
        TestClass t = (TestClass) o;
        return this.value.equalsIgnoreCase(t.value);
    }
}

为什么这是一个好习惯?也许如果我以后想使用多态性,这会有所帮助。使用 Object 作为参数是否是一个好习惯,即使我目前认为我不需要多态性但我仍然应该考虑它以防万一?

另外让我困扰的是,我们从不检查对象是否真的属于 TestClass 类型。我们为什么要进行 instanceof 检查?

你应该自己做类型检查,只是像你说的那样转换是不安全的,因为它可能是错误的类型,然后它会抛出一个 ClassCastException.

使用 object 的原因是你可能有不同的 类 这可能是相等的(虽然这种情况很少见),如果你不覆盖 equals 的对象形式那么你将面临问题使用集合,因为事物不会相等,因为集合将使用对象形式。

理论上可能有一个通用的 equals 接口,但 equals 方法早于遗传学,而且能够检查任何对象与任何其他对象简化了大量代码。