Scala案例类和继承
问题描述:
我的知识对Scala的案例类有些模糊。Scala案例类和继承
我知道case类自动获取功能,如appply
和unapply
也相等性检查(我假设它是equals
法)
自带的一个案例类的自动平等检查并不总是纠正一个应用程序。我的问题是这样的:如果我有一个扩展抽象类的case类,并且抽象类有equals(that:Any)
重写,那么case类是继承相等性检查还是仍然是自动相等性检查?
答
您可以阅读this brief section,只要编写一些代码行来尝试它,它甚至不会花费您的时间。
它说的案例类获取副本,也等于,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
^
你知道你可以只是写一些代码行尝试了这一点来吗?只要写这样一个问题,它甚至不会带你。 – sschaef 2015-01-15 17:24:57
这是一个公平点。但我希望人们能指出潜在的缺陷。例如:什么'Option.contains'用于相等性检查?我不知道,还有许多其他功能在内部进行eqaulity检查。 – Andrey 2015-01-15 17:45:51
@Andrey当问一个关于SO的问题时,预计会有一些研究。自己做一些实验,如果你不知道什么,试着去查看它(谷歌,文档,SO本身)。当你完成这个时,你可能已经做了足够的研究来发布一个问题。 例如,“Option.contains”问题的答案很容易在官方scala文档中得到解答。 – 2015-01-15 18:16:40