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