我对Scala案例类的了解有点模糊。
我知道案例类会自动获取appply
和unapply
等函数以及相等检查(我假设它是equals
方法<) / p>
案例类附带的自动相等检查并不总是正确的应用程序。
我的问题是:如果我有一个扩展抽象类的case类,并且抽象类的equals(that:Any)
被覆盖,那么case类是继承相等性检查还是它仍然是自动的平等检查?
答案 0 :(得分:1)
你可以阅读this brief section,只要编写一些代码行来试用它就不会花费你的时间。
它表示case类获取copy,并且还等于hashCode和toString,除非继承或定义了一个。后者必须具体并在AnyRef中定义。
这意味着混合使用声明等于的特性不会禁用等号。
现在我必须写一行代码来确认它......
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
^