2012-12-03 19 views
15

Bis jetzt war mein Verständnis, dass == eine Operatorüberladung für .equals() ist. Allerdings habe ich vor kurzem entdeckt, dassGroovy == Operator

new Integer(1) == new Long(1) // returns true 

während

new Integer(1).equals(new Long(1)) // returns false 

also denke ich, == ist nicht gerade eine Abkürzung für .equals(), so wie funktioniert es Gleichheit bestimmen?

+0

Dies beißt mich weiterhin bei der Verwendung von GORM, die lange Datenbank-IDs hat. Anfragen von JSON generierten ganzzahlige Werte, die folgendes Verhalten ergeben: groovy: 000> m = [1L: 'foo'] ===> [1: foo] groovig: 000> m.containsKey (1L) ===> true groovy: 000> m.containsKey (1) ===> false –

Antwort

17

== in Groovy entspricht in etwa equals() jedoch finden Sie es aus Java unterschiedlich ist, wenn verschiedene Klassen mit dem gleichen Wert zu vergleichen - wenn die Klasse Comparable ist. Groovy schreibt auch Casting wenn möglich.

Wenn Sie den Code auschecken, sieht es so aus, als ob compareToWithEqualityCheck() für == ausgeführt wird.

4

Es stellt sich heraus == delegiert nicht an equals() delegiert es an compareTo. So wird == true zurück, wenn a.compareTo(b) 0 zurück

So in diesem speziellen Fall

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

so daher:

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

aber nicht zwangsläufig bedeuten, dass

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

Die Warum das alles so komisch und verwirrend ist, liegt an der contract of Comparable erfordert nicht, dass es mit Gleichwerten übereinstimmt, obwohl es dringend empfohlen wird.

Es wird dringend empfohlen (obwohl nicht erforderlich), dass natürliche Ordnungen konsistent mit Gleichen sind. Dies ist so, weil sich sortierte Mengen (und sortierte Abbildungen) ohne explizite Vergleiche "merkwürdig" verhalten, wenn sie mit Elementen (oder Schlüsseln) verwendet werden, deren natürliche Ordnung mit Gleichem nicht übereinstimmt.