[英]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.