Groovy ==运算符

时间:2012-12-03 16:06:35

标签: groovy

到目前为止,我的理解是==.equals()的运算符重载。但是,我最近发现了

new Integer(1) == new Long(1) // returns true

,而

new Integer(1).equals(new Long(1)) // returns false

所以我猜==并不是.equals()的简写,那么它如何确定相等?

2 个答案:

答案 0 :(得分:22)

Groovy中的

==大致相当于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不一致的元素(或键)一起使用时表现得“奇怪”。