繁体   English   中英

为什么AbstractCollection没有实现equals()?

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

这是因为AbstractCollectionHashMap$Values继承自)不会覆盖#equals()

你知道为什么会这样吗?

每合同Collection#equals() ,没有通用的等于()方法Collection以及由此导致的AbstractCollection不能提供的。

请注意, HashMap$Values既不是Set也不是List,因此是窘境,从某种意义上说它不支持equals()

AbstractList和AbstractSet都扩展了AbstractCollection,它们的equals()方法具有不同的行为,由接口ListSet指定。 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM