直到现在,我的理解是这==是一个运算符重载.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 一致。之所以如此,是因为没有显式比较器的排序集(和排序映射)在与自然顺序与等于不一致的元素(或键)一起使用时表现“奇怪”。