23

直到现在,我的理解是这==是一个运算符重载.equals()。然而,我最近发现

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

然而

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

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

4

2 回答 2

23

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

如果您检查代码,看起来最终compareToWithEqualityCheck()是为==.

于 2012-12-03T16:25:30.977 回答
10

事实证明,==它没有委托给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))

这一切之所以如此奇怪和令人困惑,是因为Comparable 的契约并不要求它与 equals 一致,尽管强烈建议这样做。

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

于 2012-12-03T16:21:41.887 回答