2014-11-13 63 views
0

可能是一個普遍的問題,我不知道在Java的基於子類的哈希碼?

解決

假設我們有A類,B類和C類。如果B和C擴展A.

我們有一個

Set<A> 

A有一個基於A屬性的簡單哈希碼。我的問題是當我將B和C添加到集合中時,其中B和C可能具有與A相同的屬性。

顯然B有一些屬性C doesn' t和C有一些屬性B沒有。問題是我不能將B和C添加到集合中,因爲它們的哈希碼(使用A的哈希碼功能)將會相同。由於原因(不在這裏解釋),我不允許從Set A中刪除任何東西。

我的問題真的歸結爲,我們有2個對象A,其中一個真的是B.然而,就此而言設置和它們的哈希碼,它們是相同的。無論如何,我可以表達這兩個As,即使它們的所有A屬性都相同,實際上並不相同嗎?

如果A的hashcode函數可以基於它的底層子類的真正含義,那麼最好不過了。這可能嗎?無論如何圍繞我的問題?

+5

它不會被*基於哈希碼只*中的屬性比較這種方式。這也將落實到「equals」。這聽起來像你應該在'B'和'C'以及'A'中重寫'hashcode'和'equals',你的'equals'方法可能應該檢查'getClass()'的結果。 –

回答

3

覆蓋hashCode並等於B和C中的方法。

當哈希來比較它們將包括它們的屬性,以及委託降至A.