有两种等于方法吗?
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方法!
答案 0 :(得分:6)
实际上有一个很好的理由:
equals(Object)
方法覆盖java.lang.Object
equals(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