因此,在下面的代码段中,为什么即使在通过getClass()结果的相等测试之后我们也显式地转换了“other”类。
public boolean equals(Object other) {
.
.
.
if (getClass() != other.getClass()) return false;
Person person = (Person)other;
.
.
.
}
答案 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
接口是ArrayList
,Vector
和LinkedList
的父对象。如果你想测试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());
}