提问人:Julia Chang 提问时间:2/25/2020 最后编辑:Julia Chang 更新时间:2/25/2020 访问量:99
由伴生对象和 case 类的工厂方法创建的“对象相等”之间有什么区别?
What are the differences between "object equality" created by the factory method of the companion object and case class?
问:
当通过伴随对象的工厂方法创建的实例来比较对象相等性时,它将是 false。
class Companion(s: String)
object Companion {
def apply(s: String): Companion = {
new Companion(s)
}
}
val c1 = Companion("foo")
val c2 = Companion("foo")
println(c1 == c2) // false
但是,当案例类产生相同的情况时,为什么会是真的呢?
case class Case(s: String)
val c1 = Case("foo")
val c2 = Case("foo")
println(c1 == c2) // true
这两者之间有什么区别?
答:
3赞
Alexey Romanov
2/25/2020
#1
工厂方法无关紧要。在第一种情况下,对于 case 类,它们都只调用构造函数,因此代码可以简化为
new Companion("foo") == new Companion("foo")
和
new Case("foo") == new Case("foo")
因为 doesn't override(或继承自 class/trait override),你会得到 的定义,对于任何两个不同的实例,它是引用相等和 false。Companion
equals
equals
Object
Case
重写,因为它是一个 case 类,并且实现只是比较值。equals
s
评论
0赞
Julia Chang
2/25/2020
同伴不会覆盖等于,但 Case 会。这是关键。谢谢。
0赞
Julia Chang
2/25/2020
== 在从 case 类以外的类创建的实例之间是引用相等的,对吗?
2赞
Alexey Romanov
2/25/2020
只有当左侧的类不覆盖时,它才是引用相等。案例类只是覆盖 .equals
equals
上一个:Scala:比较数组忽略顺序
评论
==
在 Scala 中不是引用相等。a eq b