伴生对象的工厂方法创建的"object equality"和caseclass有什么区别?

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

通过伴生对象的工厂方法创建的实例比较对象是否相等时,结果为假。

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

但为什么会出现与案例class相同的情况呢?

case class Case(s: String)
val c1 = Case("foo")
val c2 = Case("foo")
println(c1 == c2) // true

这两者有什么区别?

工厂方法不相关。在您的第一种情况下,对于 classes 的情况,他们只是调用构造函数,因此代码可以简化为

new Companion("foo") == new Companion("foo")

new Case("foo") == new Case("foo")

因为 Companion 没有覆盖 equals(或者继承自 class/trait 覆盖 equals),你得到 Object 的定义任意两个不同实例的引用相等和假。

Case 覆盖 equals 因为它是 class 的情况,并且实现只是比较 s 值。