直到现在,我的理解是这==
是一个运算符重载.equals()
。然而,我最近发现
new Integer(1) == new Long(1) // returns true
然而
new Integer(1).equals(new Long(1)) // returns false
所以我想==
这不完全是 的简写.equals()
,那么它是如何确定相等的呢?
直到现在,我的理解是这==
是一个运算符重载.equals()
。然而,我最近发现
new Integer(1) == new Long(1) // returns true
然而
new Integer(1).equals(new Long(1)) // returns false
所以我想==
这不完全是 的简写.equals()
,那么它是如何确定相等的呢?
==
在 Groovy 中大致相当于equals()
. 但是,当比较具有相同值的不同类时,您会发现它与 Java 不同 - 如果类是Comparable
. 如果可能,Groovy 也会进行类型转换。
如果您检查代码,看起来最终compareToWithEqualityCheck()
是为==
.
事实证明,==
它没有委托给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 一致。之所以如此,是因为没有显式比较器的排序集(和排序映射)在与自然顺序与等于不一致的元素(或键)一起使用时表现“奇怪”。