==用于案例类和"非案例" Scala中的类

时间:2015-01-30 02:54:18

标签: scala case-class

我正在研究Scala并遇到了以下难题。

我可以定义以下案例类:

abstract class Expr
case class Number(n: Int) extends Expr

当我从班级Number创建两个实例并比较它们时

val x1 = Number(1)
val x2 = Number(1)
x1 == x2

我有以下结果:

  

x1:Number = Number(1)

     

x2:Number = Number(1)

     

res0:Boolean = true

所以x1x2是相同的。

但是,如果我将case类修饰符放在Number类定义中,即

abstract class Expr
class Number(n: Int) extends Expr

然后以相同的方式比较Number类中的两个实例

val x1 = new Number(1)
val x2 = new Number(1)
x1 == x2

我有以下输出:

  

x1:Number = Number @ 1175e2db

     

x2:Number = Number @ 61064425

     

res0:Boolean = false

它说这次x1x2不同。

你可以告诉我这是为什么吗? case在比较两个实例方面有何不同?

谢谢, 泛

1 个答案:

答案 0 :(得分:9)

在Scala中定义case类时,编译器会生成一个equals方法,用于检查深度相等(即类的内容)。

来自:http://www.scala-lang.org/old/node/107

  

对于每个案例类,Scala编译器都会生成实现结构相等性的equals方法和toString方法。

当你删除case关键字时,你会生成常规类,并对它们执行==检查引用(浅)相等性。由于您正在比较该类的两个唯一实例,即使它们的内容相同,它们也会失败引用相等。

浅层和深层平等的区别,见:
What is the difference between being shallowly and deeply equal? How is this applied to caching?