簡體   English   中英

為什么 Collection.equals() JavaDoc 說不可能正確實現 List 和 Set?

[英]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.equalsSet.equals的契約聲明列表僅等於其他列表,並設置為其他集合。 因此,當將此集合與任何列表或集合進行比較時,既不實現List也不實現Set接口的集合類的自定義 equals 方法必須返回false (根據相同的邏輯,不可能編寫一個正確實現SetList接口的類。)

我有一個關於粗體句子的問題。 為什么我不能創建一個類class SuperStringCollection implements List<String>, Set<String> ,它的equals檢查對象是否是SuperStringCollection的實例並且(為了簡單起見)將元素存儲在LinkedHashMap (並且可能還有為listIterator鏡像ArrayList中的listIterator )。 什么會使這是一個不正確的實現?

其他參考:

List.equals()

當且僅當指定的對象也是一個列表,兩個列表的大小相同,並且兩個列表中所有對應的元素對都相等時,才返回 true。

Set.equals()

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

不可能同時實現兩個接口並滿足List的“當且僅當”約束:

假設aSuperStringCollectionb是包含匹配元素的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM