5

有两种equals方法?

public boolean equals(Bigram b) {
    return b.first == first && b.second == second;
    }

@Override public boolean equals(Object o) {
    if (!(o instanceof Bigram))
        return false;
    Bigram b = (Bigram) o;
    return b.first == first && b.second == second;
}

对比这2个方法,当我们要重写equal方法时,为什么要定义一个参数为Object类型的equals方法!

4

3 回答 3

6

这其实是有充分理由的:

  • 您需要该equals(Object)方法来覆盖超类的 equals 方法java.lang.Object
  • 您通常需要一个重载equals(Bigram)方法来处理编译器可以在编译时证明类型是 Bigram 的情况。这通过避免类型检查/强制转换来提高性能,并为您提供更好的代码类型检查。
  • 最后,您可能希望以一种特殊的方式实现 equals 以测试与本身不是 Bigram 实例的对象的相等性。这应该小心使用(你真的希望不是 Bigram 实例的东西被认为等于 Bigram 吗?),但它确实有一些有效的应用程序(例如比较不同类型的集合对象的内容)。

但是,通常最好实现它们,以便一种方法调用另一种方法,例如:

public boolean equals(Bigram b) {
    return b.first == first && b.second == second;
}

@Override public boolean equals(Object o) {
    if (!(o instanceof Bigram)) return false;
    return equals((Bigram)o);
}

这种方式更简洁,意味着您只需要实现一次相等测试逻辑(不要重复自己!)。

于 2012-10-16T05:28:12.320 回答
2

调用equals()方法的框架/API(如containsKey()地图、contains()列表等)equals()从 Object 类调用重写而不是重载版本。因此,您需要定义public boolean equals(Object obj).

于 2012-10-16T05:31:21.220 回答
2

因为在覆盖的情况下,您无法缩小方法参数的范围,是的,返回类型可以是子类型,请检查下面的链接

http://docs.oracle.com/javase/tutorial/java/IandI/override.html

于 2012-10-16T05:31:50.860 回答