我正在研究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
所以x1
和x2
是相同的。
但是,如果我将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
它说这次x1
和x2
不同。
case
在比较两个实例方面有何不同?
谢谢, 泛
答案 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?