在重写equals方法时,必须遵循他的一些通用约定(general contracts):
自反性:对于任何非空引用 x,x.equals(x)
必须返回 true,说实话这条约定我不知道如何违反。
对称性:对于任何非空引用x和y,x.equals(y)的返回值必须与y.equals(x)的返回值相等,这需要如果你在一个类Student的equals方法中有对某个类Teenager的特殊比较,那Teenager的equals中也应该有对Student的特殊比较(除非你确认在集合中Teenager与Student的比较是想要的结果);或者father.equals(clid)返回true,clid.equals(father)返回false。
例:
import java.util.Objects;
public final class CaseInsensitiveString {
private final String s;
public CaseInsensitiveString(String s) {
this.s = Objects.requireNonNull(s);
}
// Broken - violates symmetry!
@Override
public boolean equals(Object o) {
if (o instanceof CaseInsensitiveString)
return s.equalsIgnoreCase(
((CaseInsensitiveString) o).s);
// 在这里对String的比较因为String没有相应的比较被称