[英]Overriding equals method in Scala
我有以下代碼。 編譯時我得到一個錯誤說
value email is not a member of Player
class Player(email: String)
{
override def equals(player: Any): Boolean = {
player match {
case p: Player => email.equals(p.email)
case _ => false
}
}
}
我是一名嘗試Scala的Java程序員,無法弄清楚為什么會出現這個錯誤(據我所知,email是播放器實例的成員)。 有人可以給出解釋以及如何解決這個問題嗎?
email
只是一個構造函數參數,而不是類本身的成員。 你可以通過在val
之前加上它來實現它
class Player(val email: String) {
override def equals(player: Any): Boolean = {
player match {
case p: Player => email.equals(p.email)
case _ => false
}
}
}
為完整起見,您還可以手動將email
作為Player
的成員:
class Player(e: String) {
val email: String = e
...
}
或者def(如果你出於某種原因想要):
class Player(e: String) {
def email: String = e
...
}
正如@ srgfed01所提到的,您也可以在構造函數中包含訪問修飾符。 例如:
class Player(private val email: String)
案例類會自動為您的類生成getter,但默認情況下它們都是公共的。
我更喜歡第一種方法來將構造函數參數聲明為一個類成員,因為它清晰,簡潔,並且減少了代碼混亂(想象一下,如果你有10個params,你想要訪問器)。
使用case類,而不是使用普通類並編寫自己的equals方法,如下所示:
case class Player(email: String)
將自動為您生成equals和hashCode方法。 額外的好處是,如果您更改字段,則保證equals / hashCode保持同步。 如果您要進行任何類型的序列化,大多數庫都會使用案例類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.