==适用于案例类别和";“非案例”;Scala中的类
我正在学习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
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级深)。