【问题标题】:Call to == does not opt to equals调用 == 不选择等于
【发布时间】:2013-05-14 15:30:31
【问题描述】:

我有以下课程:

abstract class IRDMessage extends Ordered[IRDMessage] {

  val messageType: MessageType.Type
  val timestamp: DateTime
  val content: AnyRef

  def compare(that: IRDMessage): Int = {
    val res = timestamp compareTo that.timestamp
    res
  }

  override def equals(obj: Any): Boolean = obj match{
    case message: IRDMessage => compareTo(message) == 0
    case _ => false
  }

}

我也有几个具体的实现。但是,当我尝试说 IRDMessage 的任何子类型的 a == b 时,不会调用 equals 方法,它只是比较引用(默认等于实现)。有什么想法可能导致这种情况吗?

子类是简单的案例类。

【问题讨论】:

  • 你能提供完整的工作代码来显示失败吗?当我简化您所拥有的内容时,我认为没有这样的问题。

标签: scala equality


【解决方案1】:

考虑到以下简化示例,这确实有效:

object MessageTest {
  def main(args: Array[String]) {
    val m1 = MessageImpl("foo")
    val m2 = MessageImpl("bar")
    m1 == m2
  }
}

abstract class IRDMessage extends Ordered[IRDMessage] {
  val content: AnyRef
  override def equals(obj: Any): Boolean = {
    println("in here")
    obj match{
      case message: IRDMessage => compareTo(message) == 0
      case _ => false
    }
  }

}

case class MessageImpl(content:String) extends IRDMessage{
  override def compare(that:IRDMessage) = 0
}

您能否发布更多代码,特别是您的示例案例类之一?我注意到如果我这样定义案例类:

case class MessageImpl extends IRDMessage{
  var content = "foo"
  override def compare(that:IRDMessage) = 0
}

它没有按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 2019-12-03
    • 1970-01-01
    相关资源
    最近更新 更多