我有一个案例类Foo定义如下.我想覆盖其中的行为==,以便optBar在比较中忽略最后一个元素().这是我尝试过的,似乎有效.
case class Bar(i:Int)
case class Foo(i:Int, s:String, optBar:Option[Bar]) {
override def equals(o:Any) = o match {
case Foo(`i`, `s`, _) => true
case _ => false
}
override def hashCode = i.hashCode*997 ^ s.hashCode * 991
}
val b = Bar(1)
val f1 = Foo(1, "hi", Some(b))
val f2 = Foo(1, "hi", None)
f1 == f2 // true
Run Code Online (Sandbox Code Playgroud)
我想知道的是创建方法hashCode是否正确.我从这个链接得到了它.
Rüd*_*ehn 11
您的hashCode定义是正确的,因为它符合equals/hashCode合约.但我觉得
override def hashCode = (i, s).##
Run Code Online (Sandbox Code Playgroud)
更好阅读.
为了澄清它的作用:##只是scala.Any上的一种方便方法,它调用hashCode,但正确处理null和与基元相关的一些极端情况.
val x: String = null
x.## // works fine. returns 0
x.hashCode // throws NullPointerException
Run Code Online (Sandbox Code Playgroud)
所以(i,s).##创建一个i和s的元组(它有一个定义良好的hashCode方法),然后返回它的哈希码.因此,您不必手动编写涉及MurmurHash等的哈希代码方法.顺便说一句:如果元组中的一个元素为null,这也将正常工作,而手写的哈希方法就像问题中的方法一样可能会抛出NPE.
但是,根据我的经验,如果您想修改案例类为您提供的任何内容,您实际上并不需要案例类.此外,在不考虑某些数据的情况下重写相等可能在某些方面似乎是一个聪明的想法,但它可能会导致一些非常混乱的行为.
| 归档时间: |
|
| 查看次数: |
3312 次 |
| 最近记录: |