2011-07-09 136 views
10

我正在閱讀關於數據結構的一本書。目前我在圖上,下面的代碼是圖的頂點部分。java爲什麼要等於方法輸入參數是對象

class Vertex<E>{ 
    //bunch of methods 

    public boolean equals(Object o){ 
     //some code 
    } 
} 

當我嘗試實施此equals方法我的編譯器抱怨不檢查參數的類型,只是允許任何對象發送它。這對我來說似乎有點奇怪,爲什麼該參數不應該是一個頂點而不是一個對象。是否有作者爲什麼要這樣做的原因,或者這是一個錯誤或過時的例子?

+0

的Javadoc,您能重複的*確切*編譯器的信息在這裏,好嗎? –

+0

我無法理解你會接受Object而不是Vertex。 – Jeremy

+0

我會打電話給警告,而不是錯誤。 – adarshr

回答

13
@Override 
public boolean equals(Object obj) 
{ 
    if(obj == null) return false; 
    else if (!(obj instanceof Vertex)) return false; 
    else return // blah blah 
} 
+1

首先,您可能希望檢查obj是否爲空。 –

+0

@Hovercraft完整的鰻魚固定,謝謝 –

+0

不夠公平,1+ –

3

equals是一個從Object繼承的方法,被定義爲足夠靈活,以便您可以接受任何對象並測試它是否與任何其他對象相同(因爲它應該能夠做到),那它怎麼可能以其他方式嗎?

編輯1

從jhlu87評論:
所以是不好的形式寫一個等於具有頂點的輸入參數的方法?

歡迎您來創建自己的重載任何方法,包括平等,但不改變名字都可能被迷惑許多誰還會認爲你平等是從Object繼承了一個這樣做。如果它是我的代碼,我想要一個更具體的equals方法,爲了避免混淆,我會將它與「等號」稍微區別開來。

+0

那麼編寫一個具有頂點輸入參數的equals方法不是很好的形式嗎? – jhlu87

+0

@jhlu:請參閱**編輯1 ** –

+2

無論誰投票回答我的答案:請至少發表評論。 –

10

equals(Object)是root - Object中定義的方法。如果你沒有完全匹配簽名,當某人檢查兩個對象是否相等時,Object的版本將被調用。不是你想要的。

您可能已經看過其他方法(比如比較器),您可以在其中使用確切的時間。這是因爲這些API與Jav​​a 5通用。等於不能,因爲用兩種不同的類型調用equals是有效的。它應該返回false,但它是有效的。

2

這是因爲這種方法存在仿製藥,所以落後compatabitity它必須保持這樣。

標準的解決方法強加的類型是:

return obj instanceof MyClass && <some condition>; 
0

這是因爲筆者忽略equals。 Equals在java.lang.Object中指定,並且是所有類繼承的東西。

java.lang.Object

+0

看看這裏如何正確實現equals(和hashCode)http://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java – Kristian

相關問題