簡體   English   中英

在Scala中覆蓋equals方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM