-1
我的知識對Scala的案例類有些模糊。Scala案例類和繼承
我知道case類自動獲取功能,如appply
和unapply
也相等性檢查(我假設它是equals
法)
自帶的一個案例類的自動平等檢查並不總是糾正一個應用程序。我的問題是這樣的:如果我有一個擴展抽象類的case類,並且抽象類有equals(that:Any)
重寫,那麼case類是繼承相等性檢查還是仍然是自動相等性檢查?
我的知識對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