我是 Scala 的新手。在 2.7.7 中,以下代码
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)
我错过了什么?提前致谢。
案例类相等(特别是在 Scala 2.8 中)相等和哈希码基于元组和/或乘积相等,目前不考虑类。最近在 scala-debate 邮件列表中讨论了这个问题: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)
因为 Scala 编译器覆盖了 case 类的 equals 方法,所以这种行为是 equals 的预期行为。
但是我不确定为什么 Scala 2.7.7 中的 hashCode 不同。您的示例导致 (true, true) 使用 Scala 2.8。