繁体   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