bug icon indicating copy to clipboard operation
bug copied to clipboard

Overriding `productPrefix` breaks case class hash code

Open lrytz opened this issue 1 year ago • 1 comments

scala> abstract case class C1(a: Int)
     | class C2(a: Int) extends C1(a) { override def productPrefix = "C2" }
     | class C3(a: Int) extends C1(a) { override def productPrefix = "C3" }

scala> val s = collection.mutable.HashSet.empty[C1]

scala> s.addOne(new C2(1))

scala> val c3 = new C3(1)

scala> s.find(_ == c3)
val res1: Option[C1] = Some(C2(1))

scala> s.contains(c3)
val res2: Boolean = false

lrytz avatar Sep 10 '24 13:09 lrytz

Alternatively [instead of marking productPrefix with @deprecatedOverriding as originally suggested], canEqual is broken and should include productPrefix.

som-snytt avatar Sep 10 '24 16:09 som-snytt