Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
==适用于案例类别和";“非案例”;Scala中的类_Scala_Case Class - Fatal编程技术网

==适用于案例类别和";“非案例”;Scala中的类

==适用于案例类别和";“非案例”;Scala中的类,scala,case-class,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:编号=编号(1) x2:编号=编号(1) res0:Boolean=true 所以x1和x2是相同的 但是,如果我在编号类定义中删除大小写修饰符,即 ab

我正在学习Scala,遇到了以下难题

我可以定义以下案例类:

abstract class Expr
case class Number(n: Int) extends Expr
当我从类
Number
创建两个实例并比较它们时

val x1 = Number(1)
val x2 = Number(1)
x1 == x2
我有以下结果:

x1:编号=编号(1)

x2:编号=编号(1)

res0:Boolean=true

所以
x1
x2
是相同的

但是,如果我在
编号
类定义中删除
大小写
修饰符,即

abstract class Expr
class Number(n: Int) extends Expr
然后以相同的方式比较
Number
类中的两个实例

val x1 = new Number(1)
val x2 = new Number(1)
x1 == x2
我有以下输出:

x1:编号=Number@1175e2db

x2:数字=Number@61064425

res0:Boolean=false

它说这次
x1
x2
是不同的

你能告诉我这是为什么吗?在比较两个实例时,
case
有什么区别

谢谢,
Pan

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

发件人:

对于每个case类,Scala编译器生成equals方法,该方法实现结构相等和toString方法

当您删除
case
关键字时,您将生成常规类,并对它们执行
=
检查引用(浅层)相等性。因为您正在比较类的两个唯一实例,所以即使它们的内容相同,也无法实现引用相等

有关浅相等和深相等的区别,请参见:

对不起,我错误地创建了
val x2=Number(2)
,它应该是
val x2=Number(1)
。我已经更正了它。为了精确起见,调用
==
不会强制进行引用相等性检查,它实际上会调用
等于
方法,您可以重写该方法来执行任何您想要的操作。引用相等只是普通类的默认实现,可以通过
eq
方法强制执行引用相等检查。
==
的这种行为与Java中的行为不同。通常,“浅”和“深”两个词的用法与此答案中的含义不同。普通类不重写equals(),默认实现是“referential”equality,即比较对象本身的引用。Case类比较它们的字段是否相等,但它们将比较委托给字段的equals()方法,如果以相同的方式定义,则会导致深度相等,如果不这样定义,则会导致浅层相等(仅1级深)。