【问题标题】:Equality and Case Classes等式和案例类
【发布时间】:2014-01-26 23:31:42
【问题描述】:

我有:

sealed trait BEValue

case class BEByteString(val value: Array[Byte]) extends BEValue { 
  def equals(that: BEByteString): Boolean = this.value.deep == that.value.deep
  def ==(that: BEByteString) = this equals that
}

case class BEList(val value: List[BEValue]) extends BEValue

BEByteString("spam".getBytes) == BEByteString("spam".getBytes) //true

val l1 =  BEList(BEByteString("spam".getBytes):: Nil)
val l2 =  BEList(BEByteString("spam".getBytes):: Nil)

l1 == l2 // false. Why ?

【问题讨论】:

  • 您可以在 case 类中省略 val 关键字。默认添加。
  • 我刚刚发布了另一个问题的答案,这是对您问题的更详细的答案。对于(案例)类的实例来说,正确实现 equals 和 hashCode 以在 Scala 集合库中正确运行是至关重要的。或者遭受意想不到的失败。 stackoverflow.com/a/56509518/501113

标签: scala equals case-class


【解决方案1】:

您不应该创建自己的== 方法。在scala中==方法是使用equals实现的。

您应该使用override 关键字来覆盖equals 方法。

case class BEByteString(val value: Array[Byte]) extends BEValue { 
  override def equals(that: BEByteString): Boolean = this.value.deep == that.value.deep
}
// <console>:11: error: method equals overrides nothing
//          override def equals(that: BEByteString): Boolean = this.value.deep == that.value.deep
//                       ^       

您创建了一个新的equals 方法。并且您的新 == 方法是使用您的新 equals 方法实现的。但是 case class equals 是使用Any#equals 方法来实现参数的。

Any#equals 方法签名是def equals(that: Any): Boolean

case class BEByteString(val value: Array[Byte]) extends BEValue { 
  override def equals(that: Any): Boolean = that match {
    case BEByteString(thatValue) => thatValue.deep == this.value.deep
    case _ => false
  }
}

l1 == l2 
// Boolean = true

请注意,您可以使用IndexedSeq[Byte] 代替Array[Byte]。在这种情况下,您可以使用默认的 equals 实现。它还使您的BEByteString 类不可变:使用Array[Byte] 可以更改value 的内容。

【讨论】:

  • 快速提示:java.util.Arrays.equals(this.value, that.value) 可能比 this.value.deep == that.value.deep
  • 我认为 Scala 是一种类型安全的语言 ;)
  • @Jamil:它是类型安全的,但它也允许方法重载。
  • 我说的是that: Any。也就是说 l1.equals("2") 不是编译时错误,而是 isInstanceOf/asInstanceOf 强制转换。
  • 此外,根据 stackoverflow.com/questions/7370925/… ,您还需要定义 hashCode 。见artima.com/lejava/articles/equality.html
猜你喜欢
  • 1970-01-01
  • 2017-02-25
  • 2012-10-17
  • 2011-07-15
  • 1970-01-01
  • 2016-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多