Scala Semantik von Gleichen / hashCode für Fallklassen mit Zügen
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.
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.