2013-06-29 40 views
3

有人能告訴我爲什麼這返回true? 我想如果我把東西扔到Object,然後撥打.equals, 將使用Object的默認實現。並且s1 == s2應返回false: -/Java Object.equals

請告訴我哪些主題可以找到更多關於此行爲的信息。

Set<String> s1 = new HashSet<String>(as("a")); 
    Set<String> s2 = new HashSet<String>(as("a")); 

    Object o1 = (Object)s1; 
    Object o2 = (Object)s2; 

    System.out.println(o1.equals(o2)); 

回答

4

默認情況下,Java中的方法是虛擬的。特別是,Object.equals是虛擬的(因爲它沒有被聲明爲final)。由於HashSet overrides Object.equals ,你會看到HashSet實施equals當你調用虛擬方法有HashSet運行時類型(還記得dynamic dispatch依賴於運行類型的接收對象的,而不是編譯的對象上使用時間型)。

:我們知道,HashSet覆蓋Object.equals因爲documentationHashSetAbstractSet派生和AbstractSet.equals的文件說:

比較指定對象與此set的相等。如果指定對象也是一個集合,則兩個集合具有相同的大小,並且指定集合中的每個成員都包含在此集合中(或等價地,此集合中的每個成員都包含在指定集合中),則返回true。該定義確保equals方法在設置接口的不同實現之間正常工作。

其中明確限定平等而默認Object.equals是身份平等。

2

因爲,中多態性

在運行時,對象的實際類型決定了應該執行哪個方法的實施方法。因爲,HashSetAbstractSet繼承的重寫實現它用來進行比較的,而不是Object.equals()

而且,JavaDoc中AbstractSet#equals()狀態

如果給定對象也是一組,兩組有

返回true相同的大小,並且給定集合的每個成員都包含在這個集合中。

因此,您的平等測試打印true

所以,參考類型(對象,在你的情況下)幾乎不影響在運行時調用equals()版本。它完全取決於你參考文獻指向的類型

5

因爲這正是Javadocs說,這將做到:

公共布爾等於(對象o)
比較指定對象與此set的相等。如果給定對象也是一個集合,則返回true,這兩個集合具有相同的大小,並且給定集合中的每個成員都包含在此集合中。這確保了equals方法在Set接口的不同實現中正常工作。

僅僅因爲您將其投射到Object不會改變它的實際內容。使用HashSet中的方法equals()

1

是的等於的默認實現應該返回false。但是這裏沒有調用默認實現。對象類由java中的每種類型擴展幷包含HashSet。

現在在這裏如果你看到,你指的是帶有Object類引用的HashSet對象。因此HashSet等於被調用。因此它返回true。

相關問題