Scala 案例 类 和继承

Scala case classes and inheritance

我对 Scala 案例的了解有点模糊 classes.

我知道 case classes 会自动获得 appplyunapply 等函数以及相等性检查(我假设它是 equals 方法)

案例 class 附带的自动相等性检查对于应用程序并不总是正确的。

我的问题是:如果我有一个扩展抽象 class 的案例 class,并且抽象 class 覆盖了它的 equals(that:Any),那么案例class继承相等性检查还是自动相等性检查?

您可以阅读 this brief section 甚至不需要写几行代码就可以尝试。

它说案例 class 得到副本,并且还等于 hashCode 和 toString 除非一个是继承或定义的。后者必须是具体的并且在 AnyRef 之外的其他地方定义。

这意味着混入声明 equals 的特征不会禁用 equals。

现在我得去写一行代码来确认了...

scala> trait Ickwals { def equals(other: Any): Boolean }
defined trait Ickwals

scala> case class C(i: Int) extends Ickwals
defined class C

scala> :javap C#equals
  public boolean equals(java.lang.Object);
    descriptor: (Ljava/lang/Object;)Z
[generated]

scala> trait Ickwals { override def equals(other: Any): Boolean = false }
defined trait Ickwals

scala> case class C(i: Int) extends Ickwals
defined class C

scala> :javap C#equals
  public boolean equals(java.lang.Object);
    descriptor: (Ljava/lang/Object;)Z
[as implemented]

scala> trait Ickwals { def equals(other: Any): Boolean ; def copy(i: Int): Nothing }
defined trait Ickwals

scala> case class C(i: Int) extends Ickwals
<console>:8: error: class C needs to be abstract, since method copy in trait Ickwals of type (i: Int)Nothing is not defined
       case class C(i: Int) extends Ickwals
                  ^