繁体   English   中英

Scala:我的等于方法正确吗?

[英]Scala: Is my `equals` method correct?

我为A类写了一个equals方法。

class A(x: Int, s: String) {
  override def equals(that: Any) = that match {
    case a: A => this.x == a.x && this.s == a.s
    case _    => false
  } 
}

这是正确的吗?

对,那是正确的。 但是,您还应该重写hashCode方法以反映相等性。 也就是说,如果您有两个实例ab ,其中a == b ,则应确保a.hashCode == b.hashCode

实现两者的最简单方法是使用案例类:

case class A(private val x: Int, private val s: String)

这给您正确的equals和“免费”的hashCode


如果您计划可能存在A子类,则可以查看Odersky的canEqual想法 (也在此处 )。

更好的方法是在A的伴随对象上定义一个Ordering [A]实例。

object A{
    implicit object aOrdering extends Ordering[A]{
        override def compare(x:A,y:A):Int = ......
    }
}

比您应等于:

override def equals(that: Any) = that match {
  case a: A => {
        val ordering = implicitly[Ordering[A]] 
        ordering.compare(this,a) == 0 
 }
  case _    => false
} 

这样,您可以重用您的代码,即scala集合以及此类需要订购的其他地方。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM