到目前为止,我的理解是==
是.equals()
的运算符重载。但是,我最近发现了
new Integer(1) == new Long(1) // returns true
,而
new Integer(1).equals(new Long(1)) // returns false
所以我猜==
并不是.equals()
的简写,那么它如何确定相等?
答案 0 :(得分:22)
==
大致相当于equals()
,但是,当比较具有相同值的不同类时,如果类为Comparable
,您会发现它与Java不同。如果可能的话,Groovy也会进行类型转换。
如果您查看代码,最终会==
执行compareToWithEqualityCheck()
。
答案 1 :(得分:9)
结果==
未委托给equals()
,它委托给compareTo
。如果==
返回0
a.compareTo(b)
将返回true
所以在这个特殊情况下
new Integer(1).compareTo(new Long(1)) == 0
因此:
new Integer(1) == new Long(1)
但这并不一定意味着
new Integer(1).equals(new Long(1))
之所以如此奇怪和混乱是因为contract of Comparable并不要求它与equals一致,尽管强烈建议这样做。
强烈建议(尽管不要求)自然排序与equals一致。这是因为没有显式比较器的有序集(和有序映射)在与自然顺序与equals不一致的元素(或键)一起使用时表现得“奇怪”。