2015-01-15 198 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 
       ^