[英]Why does AbstractCollection implement both Iterable and Collection?
[英]Why does the Collection.equals() JavaDoc say it's not possible to correctly implement both List and Set?
Collection.equals(Object)
的API 文檔說:
Object.equals
方法的一般約定規定 equals 必須是對稱的(換句話說,a.equals(b)
當且僅當b.equals(a)
)。List.equals
和Set.equals
的契約聲明列表僅等於其他列表,並設置為其他集合。 因此,當將此集合與任何列表或集合進行比較時,既不實現List
也不實現Set
接口的集合類的自定義 equals 方法必須返回false
。 (根據相同的邏輯,不可能編寫一個正確實現Set
和List
接口的類。)
我有一個關於粗體句子的問題。 為什么我不能創建一個類class SuperStringCollection implements List<String>, Set<String>
,它的equals
檢查對象是否是SuperStringCollection
的實例並且(為了簡單起見)將元素存儲在LinkedHashMap
(並且可能還有為listIterator
鏡像ArrayList
中的listIterator
)。 什么會使這是一個不正確的實現?
其他參考:
當且僅當指定的對象也是一個列表,兩個列表的大小相同,並且兩個列表中所有對應的元素對都相等時,才返回 true。
如果指定的對象也是一個集合,兩個集合的大小相同,並且指定集合的每個成員都包含在這個集合中(或者等價地,這個集合的每個成員都包含在指定的集合中),則返回 true。 此定義可確保 equals 方法在 set 接口的不同實現中正常工作。
不可能同時實現兩個接口並滿足List
的“當且僅當”約束:
假設a
是SuperStringCollection
, b
是包含匹配元素的HashSet
。
b.equals(a)
將返回true
因為a
是一個集合並且包含相同的元素。a.equals(b)
也應該返回true
。a.equals(b)
需要返回false
因為List.equals()
的契約說b
必須是List
,而事實並非如此。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.