具有特征的case类的equals / hashCode的Scala语义

时间:2010-01-11 20:11:10

标签: scala equals case hashcode traits

我是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)

我错过了什么?提前谢谢。

2 个答案:

答案 0 :(得分:8)

案例类相等(特别是在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)

答案 1 :(得分:2)

对于equals,此行为是预期的,因为Scala编译器会覆盖case类的equals方法。

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