2010-01-11 22 views
3

Je suis un nouveau venu à Scala. En 2.7.7, le code suivantSémantique Scala d'égal à/hashCode pour les classes de cas avec des traits

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) 

impressions

(false,true) 

alors que je me serais attendu à

(false,false) 

Qu'est-ce que je manque? Merci d'avance.

+2

C'est un bug, et il a été fixé sur Scala 2.8. –

+0

Ah, c'est un soulagement. Merci à tous pour vos réponses. – user248348

Répondre

8

L'égalité des classes de cas (en particulier dans Scala 2.8) et les codes de hachage sont basés sur l'égalité des tuple et/ou des produits, et ne prennent actuellement pas en compte la classe. Il y a eu une récente discussion à ce sujet sur la liste de diffusion scala-débat ici: http://old.nabble.com/Possible-Collision-Issue-with-Product.hashCode-td27026790.html

Pour ce que ça vaut la peine, voici ce qu'il ressemble actuellement à 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) 
2

Ce comportement est attendu pour les égales car le compilateur Scala remplace la méthode égale pour les classes de cas.

Je ne suis cependant pas sûr pourquoi le hashCode est différent dans Scala 2.7.7. Votre exemple aboutit à (vrai, vrai) en utilisant Scala 2.8.