Scala案例类和继承

时间:2015-01-15 17:10:30

标签: scala inheritance case-class

我对Scala案例类的了解有点模糊。

我知道案例类会自动获取appplyunapply等函数以及相等检查(我假设它是equals方法<) / p>

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

我的问题是:如果我有一个扩展抽象类的case类,并且抽象类的equals(that:Any)被覆盖,那么case类是继承相等性检查还是它仍然是自动的平等检查?

1 个答案:

答案 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
                  ^