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ます。したがって、 0==を返す場合はtrueを返しますa.compareTo(b)

したがって、この特定のケースでは

new Integer(1).compareTo(new Long(1)) == 0

したがって:

new Integer(1) == new Long(1)

しかし、これは必ずしもそれを意味するわけではありません

new Integer(1).equals(new Long(1))

これが非常に奇妙で紛らわしい理由は、Comparableのコントラクトでは、equalsとの整合性が要求されていないためですが、強くお勧めします。

自然な順序が等しいと一致していることを強くお勧めします(必須ではありません)。これは、明示的なコンパレータのないソートされたセット(およびソートされたマップ)が、自然な順序が等しいと矛盾する要素(またはキー)で使用される場合、「奇妙に」動作するためです。

于 2012-12-03T16:21:41.887 に答える