2010-01-11 61 views
3

我是Scala的新手。在2.7.7,下面的代碼具有特徵的case類的equals/hashCode的Scala語義

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) 

打印

(false,true) 

,而我本來期望

(false,false) 

我缺少什麼?提前致謝。

+2

這是一個錯誤,並已經固定在Scala 2.8上。 – 2010-01-11 21:19:52

+0

啊,這是一種解脫。謝謝大家,爲你的答案。 – user248348 2010-01-11 22:47:34

回答

8

案例類相等(特別是在Scala 2.8中)相等和哈希代碼基於元組和/或產品相等性,並且當前不考慮該類。有上階議的郵件列表在這裏對此事最近的討論:http://old.nabble.com/Possible-Collision-Issue-with-Product.hashCode-td27026790.html

對於它的價值,這裏就是它目前看起來像在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

由於Scala編譯器重寫了case類的equals方法,因此期望出現此行爲。

但我不確定hashCode爲什麼在Scala 2.7.7中有所不同。您的示例使用Scala 2.8生成(true,true)。