java8 重写 equals 带来的困惑
在 java 中,当我们希望两个对象进行相等比较时,需要重写 object 类的 equals 方法。然而,对于重写后如何对对象进行强转,却常常引起困惑。
问题:强转的必要性
以下代码展示了重写的 equals 方法:
public class Phone {
// ... 代码略 ...
@Override
public boolean equals(Object obj) {
// ... 代码略 ...
if (obj instanceof Phone) {
Phone other = (Phone) obj;
// ... 代码略 ...
}
// ... 代码略 ...
}
}
答案:
实际上,即使 obj 是 phone 类型,但 equals 方法的形参类型是 object。这意味着可以传入任何类型的对象,而不仅仅是 phone 对象。若不进行强转,编译器会提示错误,因为 object 类中没有 getname() 和 getprice() 方法。
强转的目的是告诉编译器:
注意事项
需要注意的是,如果重写了 equals 方法,则也需要重写 hashcode 方法。否则,在将自定义对象添加到集合类时可能会出现意外行为。