Frage

Ich bin ein Neuling in Scala. In 2.7.7 wird folgender Code

abstract class C
case class CC() extends C

trait T

val c1 = CC()
val c2 = new CC() with T
println(c1.hashCode == c2.hashCode,c1 equals c2)

druckt

(false,true)

während ich hätte erwartet,

(false,false)

Was bin ich? Vielen Dank im Voraus.

War es hilfreich?

Lösung

Case Klasse Gleichheit (vor allem in Scala 2.8) Gleichheit und Hash-Codes basieren auf Tupel und / oder Produkt Gleichheit, und nehmen Sie nicht gerade die Klasse berücksichtigt. Es gab eine aktuelle Diskussion zu diesem Thema auf der scala-Debatte Mailingliste hier: http://old.nabble.com/Possible-Collision-Issue-with-Product.hashCode-td27026790.html

Es lohnt sich, was hier ist, was es sieht derzeit wie in 2.8:

Welcome to Scala version 2.8.0.Beta1-RC6 (Java HotSpot(TM) Client VM, Java 1.6.0_16).
Type in expressions to have them evaluated.
Type :help for more information.

scala> abstract class C
defined class C

scala> case class CC() extends C
defined class CC

scala> trait T
defined trait T

scala> val c1 = CC()
c1: CC = CC()

scala> val c2 = new CC() with T
c2: CC with T = CC()

scala> println(c1.hashCode == c2.hashCode,c1 equals c2)
(true,true)

Andere Tipps

Dieses Verhalten wird für equals zu erwarten, da die Scala-Compiler überschreibt die Methode für Fallklassen gleich.

Ich bin aber nicht sicher, warum die hashCode in Scala 2.7.7 unterscheidet. Ihr Beispiel ergibt (true, true) mit Scala 2.8.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top