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

标签 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)

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

最佳答案

案例类相等(特别是在 Scala 2.8 中)相等和哈希码基于元组和/或乘积相等,目前不考虑类。最近在 scala-debate 邮件列表上有一个关于这个问题的讨论:http://old.nabble.com/Possible-Collision-Issue-with-Product.hashCode-td27026790.html

对于它的值(value),这是它目前在 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)

关于具有特征的案例类的equals/hashCode的Scala语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2044597/

相关文章:

string - 在 Groovy Switch-Case 语句中使用静态字符串

sql - 如何在 PostgreSQL 中实现 CASE 返回多行

Scala:将隐式参数传递给返回另一个函数的函数

scala - 如何废弃 scala 类构造的样板?

scala - 如何通过在Scala集合中使用多个列进行分组

javascript - JavaScript 中 a = b == c 的优先顺序是什么?

scala - 处理 Scala Play 模板中的选项

c# - Contains 如何返回 false 但 GetHashCode() 返回相同的数字,而 Equals 返回 true?

function - Lua - 是否可以检查 2 个函数是否相等?

c - 嵌套 if 或 switch case 语句