これまでの私の理解では、これ==
はの演算子のオーバーロードです.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
ます。したがって、 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との整合性が要求されていないためですが、強くお勧めします。
自然な順序が等しいと一致していることを強くお勧めします(必須ではありません)。これは、明示的なコンパレータのないソートされたセット(およびソートされたマップ)が、自然な順序が等しいと矛盾する要素(またはキー)で使用される場合、「奇妙に」動作するためです。