为什么要在重写equals()之前构建要比较的类?

时间:2014-09-10 17:10:36

标签: casting equality

因此,在下面的代码段中,为什么即使在通过getClass()结果的相等测试之后我们也显式地转换了“other”类。

public boolean equals(Object other) {
.
.
.
if (getClass() != other.getClass()) return false;

Person person = (Person)other;
.
.
.
}

2 个答案:

答案 0 :(得分:0)

您可以在进行比较时执行person.getterOnPerson()。回想一下,Object类不包含检索所需值的所有必要方法。

答案 1 :(得分:0)

为了使代码能够访问Person对象中的任何方法或字段,必须进行转换。

public boolean equals(Object other){

   if( !(other instanceof Person)){
       return false;
   }

   Person otherPerson = (Person)other;

   //now we can check equality
   return getLastname().equals(otherPerson.getLastname() )
        && getFirstname().equals(otherPerson.getFirstname() );
}

修改 如果要检查对象不是直接子类的相等性,还可以使用instanceof来测试对象是否实现和接口。例如,List接口是ArrayListVectorLinkedList的父对象。如果你想测试2个对象的相等性,其中的类型是其中任何一个,你可以通过检查两个对象是否实现List并且它们的元素都是相同的并且顺序相同。

以下是来自AbstractList的代码。请注意,我们必须转换为列表才能在另一个对象上调用方法listIterator()

 public boolean equals(Object o) {
    if (o == this)
        return true;
    if (!(o instanceof List))
        return false;

    ListIterator<E> e1 = listIterator();
    ListIterator<?> e2 = ((List<?>) o).listIterator();
    while (e1.hasNext() && e2.hasNext()) {
        E o1 = e1.next();
        Object o2 = e2.next();
        if (!(o1==null ? o2==null : o1.equals(o2)))
            return false;
    }
    //this check will return false if either iterator
    //still has elements left which means the lists aren't the same size. 
    return !(e1.hasNext() || e2.hasNext());
}