因此,在下面的代碼段中,爲什麼我們會在通過getClass()結果的相等性測試後明確地轉換「其他」類。爲什麼要在重寫equals()之前投入一個類進行比較?
public boolean equals(Object other) {
.
.
.
if (getClass() != other.getClass()) return false;
Person person = (Person)other;
.
.
.
}
因此,在下面的代碼段中,爲什麼我們會在通過getClass()結果的相等性測試後明確地轉換「其他」類。爲什麼要在重寫equals()之前投入一個類進行比較?
public boolean equals(Object other) {
.
.
.
if (getClass() != other.getClass()) return false;
Person person = (Person)other;
.
.
.
}
您現在可以在做比較時做person.getterOnPerson()
。回想一下,Object類不包含檢索所需值的所有必要方法。
代碼必須能夠訪問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
的父對象。如果您想測試兩個對象的相等性,其中的任何類型都是這兩個對象的類型,您可以通過檢查這兩個對象是否實現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());
}
謝謝先生。這是否意味着我們無法比較來自兩種不同樹的兩個類的對象?我的意思是如果一個類不是另一個的子類... – 2014-09-13 10:19:04
已更新的答案解決您的問題 – dkatzel 2014-09-15 14:35:58
因此您可以訪問該類的成員。 – BoltClock 2014-09-10 17:13:54
如果您在沒有明確強制轉換的情況下將'Object'視爲'Person',編譯器將會抱怨。例如,如果您使用'other.firstName',則會失敗,但如果Person類具有該成員,則可以使用'person.firstName'。 – 2014-09-10 17:14:05