1

I have the following class:

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
  }

}

I have a couple of concrete implementations as well. However, when I try to say a == b of any subtype of IRDMessage the equals method does not get called and it simply compares references (default equals implementation). Any ideas what might be causing this?

The subclasses are simple case classes btw.

om-nom-nom
  • 62,329
  • 13
  • 183
  • 228
user221218
  • 143
  • 1
  • 1
  • 6
  • 3
    Can you provide complete working code showing the failure? I see no such problem when I simplify what you've got. – Rex Kerr May 14 '13 at 15:40

1 Answers1

1

This does actually work given the following simplified example:

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
}

Can you post a little more code, specifically one of your sample case classes? I noticed if I defined the case class like so:

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

It does not work as expected.

cmbaxter
  • 35,283
  • 4
  • 86
  • 95