繁体   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