我为课程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
}
}
这是对的吗?
答案 0 :(得分:5)
是的,这是正确的。但是,您还应该覆盖hashCode
方法以反映相等性。也就是说,如果您有两个a
实例和b
a == b
,则应确保a.hashCode == b.hashCode
。
实现这两者的最简单方法是使用案例类:
case class A(private val x: Int, private val s: String)
这为您提供正确的equals
和hashCode
以及#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集合以及您需要为此类订购的其他地方。