Scala 案例 类 和继承
Scala case classes and inheritance
我对 Scala 案例的了解有点模糊 classes.
我知道 case classes 会自动获得 appply
和 unapply
等函数以及相等性检查(我假设它是 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
^
我对 Scala 案例的了解有点模糊 classes.
我知道 case classes 会自动获得 appply
和 unapply
等函数以及相等性检查(我假设它是 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
^