2009-08-28 10 views
3

Wie die Orderedtrait fordert, ist die equals Methode auf Scala BigDecimal Klasse mit der Bestellung übereinstimmt. Der Hashcode wird jedoch einfach aus dem eingepackten java.math.BigDecimal übernommen und ist daher inkonsistent mit equals.Verstößt Scales BigDecimal gegen den equals/hashCode-Vertrag?

object DecTest { 
    def main(args: Array[String]) { 
    val d1 = BigDecimal("2") 
    val d2 = BigDecimal("2.00") 
    println(d1 == d2) //prints true 
    println(d1.hashCode == d2.hashCode) //prints false 
    } 
} 

Ich kann keinen Hinweis auf ein bekanntes Problem finden. Fehle ich etwas?

Antwort

7

Die Leute auf der Scala User Mailing Liste scheinen zuzustimmen, dass dies ein Bug ist. Ich nehme an, dass es bis jetzt nicht abgeholt wurde, weil niemand jemals einen BigDecimal als Schlüssel in einer Hash-Struktur verwendet hat. Es war filed as bug #2304

0

Aktualisierung: Diese Antwort ist falsch! Ich habe es weggelassen, weil ich denke, dass die Kommentare nützlich sind, um zu sehen, warum es falsch ist. Diese


ist kein Beispiel für eine Verletzung des equals/hashCode Vertrag. Sie müssten prüfen, ob d1.equals(d2) gleichbedeutend ist. Und tatsächlich gibt d1.equals(d2) false zurück. Warum?

Es ist, weil "2" nicht genau dasselbe wie "2.00" ist; Der Wert auf der rechten Seite hat signifikantere Ziffern. Mit anderen Worten sind sie in Wert (2 == 2.00) gleich, unterscheiden sich aber in Skala (0! = 2).

Wenn Sie den Quellcode here lesen, können Sie sehen, dass für zwei Zahlen, es fällt auf die Java BigDecimalequals Implementierung. Dann beschreibt das Lesen der Java documentation, wie dies im Detail funktioniert.

+2

Wer upvoting ist, muss gehen und über Scala lesen! '==' in Scala ist äquivalent zu '.equals' in Java. ** Diese Antwort ist falsch ** –

+0

* @ John * - hast du versucht, deine Antwort in Scala zu laufen? Es ist nicht richtig! 'scala.BigDecimal' und' java.math.BigDecimal' sind verschiedene Dinge –

+0

* @ John * - tut mir leid, Karpfen auf: Wenn Sie Ihrem Link folgen, können Sie sehen, dass die "equals" -Methode zu Java 'BigDecimal.compare fällt 'Methode –