2015-01-15 104 views
-1

我的知识对Scala的案例类有些模糊。Scala案例类和继承

我知道case类自动获取功能,如appplyunapply也相等性检查(我假设它是equals法)

自带的一个案例类的自动平等检查并不总是纠正一个应用程序。我的问题是这样的:如果我有一个扩展抽象类的case类,并且抽象类有equals(that:Any)重写,那么case类是继承相等性检查还是仍然是自动相等性检查?

+7

你知道你可以只是写一些代码行尝试了这一点来吗?只要写这样一个问题,它甚至不会带你。 – sschaef 2015-01-15 17:24:57

+0

这是一个公平点。但我希望人们能指出潜在的缺陷。例如:什么'Option.contains'用于相等性检查?我不知道,还有许多其他功能在内部进行eqaulity检查。 – Andrey 2015-01-15 17:45:51

+2

@Andrey当问一个关于SO的问题时,预计会有一些研究。自己做一些实验,如果你不知道什么,试着去查看它(谷歌,文档,SO本身)。当你完成这个时,你可能已经做了足够的研究来发布一个问题。 例如,“Option.contains”问题的答案很容易在官方scala文档中得到解答。 – 2015-01-15 18:16:40

回答

1

您可以阅读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 
       ^