[英]Why AbstractCollection does not implement equals()?
你知道嗎 :
Map<Object,Object> m1 = new HashMap<Object, Object>();
Map<Object,Object> m2 = new HashMap<Object, Object>();
System.out.println("m1.equals(m2) = "+m1.equals(m2));
System.out.println("m1.keySet().equals(m2.keySet()) = "
+m1.keySet().equals(m2.keySet()));
System.out.println("m1.entrySet().equals(m2.entrySet()) = "
+m1.entrySet().equals(m2.entrySet()));
System.out.println("m1.values().equals(m2.values()) = "
+m1.values().equals(m2.values()));
輸出:
m1.equals(m2) = true
m1.keySet().equals(m2.keySet()) = true
m1.entrySet().equals(m2.entrySet()) = true
m1.values().equals(m2.values()) = false
這是因為AbstractCollection
( HashMap$Values
繼承自)不會覆蓋#equals()
。
你知道為什么會這樣嗎?
每合同Collection#equals()
,沒有通用的等於()方法Collection
以及由此導致的AbstractCollection
不能提供的。
請注意, HashMap$Values
既不是Set也不是List,因此是窘境,從某種意義上說它不支持equals()
。
AbstractList和AbstractSet都擴展了AbstractCollection,它們的equals()方法具有不同的行為,由接口List和Set指定。 Collection的界面說:
雖然Collection接口沒有為Object.equals的一般合同添加任何規定,但是“直接”實現Collection接口的程序員(換句話說,創建一個Collection是集合但不是Set或List的類)必須小心如果他們選擇覆蓋Object.equals。
所以AbstractCollection絕對不應該重寫equals()。 也就是說,我真的不知道為什么HashMap $ Values不會實現equals()本身。
我不確定這是否是官方原因,但AbstractCollection避免在潛在的子類上添加語義約束。 等式的語義由具體的繼承數據結構的性質決定,特別是基於您的結構是否有序以及是否允許重復。
例如,考慮TreeSet,LinkedList,Bag等。
順便說一下,關於您發布的代碼,值返回的實際類型是什么? 這應該是具有具體實現的子類。如果在運行此代碼時映射為空,則可能最終會出現不考慮兩個空集相等的內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.