Groovy==运算符

Groovy==运算符,groovy,Groovy,到目前为止,我的理解是==是.equals()的运算符重载。然而,我最近发现 new Integer(1) == new Long(1) // returns true 鉴于 new Integer(1).equals(new Long(1)) // returns false 所以我猜=并不是.equals()的简写,那么它是如何确定相等的呢?结果是=并没有委托给equals(),而是委托给compareTo。因此,如果a.compareTo(b)返回0,则==将返回true 所以在这个特

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

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

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

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

结果是
=
并没有委托给
equals()
,而是委托给
compareTo
。因此,如果
a.compareTo(b)
返回0,则
==
将返回true

所以在这个特殊的情况下

new Integer(1).compareTo(new Long(1)) == 0
因此:

new Integer(1) == new Long(1)
但这并不一定意味着

new Integer(1).equals(new Long(1))
这一切之所以如此奇怪和令人困惑,是因为虽然强烈建议使用equals,但并不要求它与equals保持一致

强烈建议(尽管不是必需的)自然顺序与equals一致。这是因为没有显式比较器的排序集(和排序映射)在与自然顺序与equals不一致的元素(或键)一起使用时表现“奇怪”


Groovy中的
=
大致相当于
equals()
,但是,如果类是
可比的,那么在比较具有相同值的不同类时,您会发现它与Java不同。如果可能,Groovy也进行类型转换


如果您签出代码,它看起来像是为
==

执行的。当使用GORM时,它有很长的数据库ID。来自JSON的请求生成的整数值会产生如下行为:groovy:000>m=[1L:foo']==>[1:foo]groovy:000>m.containsKey(1L)==>true groovy:000>m.containsKey(1)==>false