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