加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

==用于案例类和Scala中的“非案例”类

发布时间:2020-12-16 09:54:07 所属栏目:安全 来源:网络整理
导读:我正在研究 Scala并遇到了以下难题. 我可以定义以下案例类: abstract class Exprcase class Number(n: Int) extends Expr 当我从类Number创建两个实例并进行比较时 val x1 = Number(1)val x2 = Number(1)x1 == x2 我有以下结果: x1: Number = Number(1) x2
我正在研究 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是相同的.

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

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是不同的.

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

谢谢,

解决方法

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

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

For every case class the Scala compiler generates equals method which implements structural equality and a toString method.

删除case关键字时,会生成常规类,并对它们执行==检查以获得引用(浅)相等性.由于您要比较类的两个唯一实例,因此即使它们的内容相同,它们也会失败引用相等性.

对于浅层和深层平等之间的区别,请参阅:
What is the difference between being shallowly and deeply equal? How is this applied to caching?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读