有两种equals()方法

时间:2012-10-16 05:25:08

标签: java override 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种方法进行比较,当我们想要覆盖等于方法时,为什么我们需要定义一个参数为类型为Object 的equals方法!

3 个答案:

答案 0 :(得分:6)

实际上有一个很好的理由:

  • 您需要使用equals(Object)方法覆盖java.lang.Object
  • 中的超类equals方法
  • 您经常想要一个重载的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);
}

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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