由伴生对象和 case 类的工厂方法创建的“对象相等”之间有什么区别?

What are the differences between "object equality" created by the factory method of the companion object and case class?

提问人:Julia Chang 提问时间:2/25/2020 最后编辑:Julia Chang 更新时间:2/25/2020 访问量:99

问:

当通过伴随对象的工厂方法创建的实例来比较对象相等性时,它将是 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

这两者之间有什么区别?

Scala Equality 大小写类 companion-object

评论

1赞 user2357112 2/25/2020
==在 Scala 中不是引用相等。
1赞 Luis Miguel Mejía Suárez 2/25/2020
如果真的想要引用相等,请使用 .a eq b

答:

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。CompanionequalsequalsObject

Case重写,因为它是一个 case 类,并且实现只是比较值。equalss

评论

0赞 Julia Chang 2/25/2020
同伴不会覆盖等于,但 Case 会。这是关键。谢谢。
0赞 Julia Chang 2/25/2020
== 在从 case 类以外的类创建的实例之间是引用相等的,对吗?
2赞 Alexey Romanov 2/25/2020
只有当左侧的类不覆盖时,它才是引用相等。案例类只是覆盖 .equalsequals