【问题标题】:Scala semantics of equals/hashCode for case classes with traits具有特征的案例类的equals/hashCode的Scala语义
【发布时间】:2010-01-11 20:11:09
【问题描述】:

我是 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 equals case hashcode traits


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    由于 Scala 编译器覆盖了 case 类的 equals 方法,因此这种行为是预期的。

    但是我不确定为什么 Scala 2.7.7 中的 hashCode 不同。您的示例使用 Scala 2.8 导致 (true, true)。

    【讨论】:

      猜你喜欢
      • 2016-11-26
      • 2012-10-22
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多