斯卡拉:我的“等于”方法是否正确?

时间:2015-12-13 13:13:08

标签: scala

我为课程equals编写了A方法。

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
  } 
}

这是对的吗?

2 个答案:

答案 0 :(得分:5)

是的,这是正确的。但是,您还应该覆盖hashCode方法以反映相等性。也就是说,如果您有两个a实例和b a == b,则应确保a.hashCode == b.hashCode

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

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

这为您提供正确的equalshashCode以及#34;免费"。

如果您计划有A个子类的可能性,您可以查看Odersky的idea of canEqual(还有here)。

答案 1 :(得分:0)

更好的方法是定义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集合以及您需要为此类订购的其他地方。