到目前为止,我的理解是==操作员超载.equals().但是,我最近发现了这一点
new Integer(1) == new Long(1) // returns true
Run Code Online (Sandbox Code Playgroud)
而
new Integer(1).equals(new Long(1)) // returns false
Run Code Online (Sandbox Code Playgroud)
所以我猜==这不是一个简写.equals(),所以它如何决定平等?
doe*_*eri 22
==在Groovy中大致相当于equals(),但是,当比较具有相同值的不同类时,您会发现它与Java不同 - 如果类是Comparable.如果可能的话,Groovy也会进行类型转换.
如果您查看代码,它看起来最终会compareToWithEqualityCheck()被执行==.
事实证明==它没有委托equals(),它委托给compareTo.因此,==将返回true,如果a.compareTo(b)返回0
所以在这种特殊情况下
new Integer(1).compareTo(new Long(1)) == 0
Run Code Online (Sandbox Code Playgroud)
所以:
new Integer(1) == new Long(1)
Run Code Online (Sandbox Code Playgroud)
但这并不一定意味着
new Integer(1).equals(new Long(1))
Run Code Online (Sandbox Code Playgroud)
之所以如此奇怪和令人困惑,是因为Comparable的合同并不要求它与equals一致,尽管强烈建议.
强烈建议(尽管不要求)自然排序与equals一致.这是因为没有显式比较器的有序集(和有序映射)在与自然顺序与equals不一致的元素(或键)一起使用时表现得"奇怪".