-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Closed
Description
Compiler version
3.7.2
Minimized code
object Foo {
override def equals(that : Any) = that match {
case _: this.type => true
case _ => false
}
}
val _ = Foo.equals(Foo)Calling Foo.equals(Foo) will generate a Stack Overflow at Runtime
Output
java.lang.StackOverflowError
at Playground$Foo$.equals(main.scala:5)
at Playground$Foo$.equals(main.scala:5)
at Playground$Foo$.equals(main.scala:5)
at Playground$Foo$.equals(main.scala:5)
at Playground$Foo$.equals(main.scala:5)
at Playground$Foo$.equals(main.scala:5)
at Playground$Foo$.equals(main.scala:5)
at Playground$Foo$.equals(main.scala:5)
at Playground$Foo$.equals(main.scala:5)
at Playground$Foo$.equals(main.scala:5)
at Playground$Foo$.equals(main.scala:5)
at Playground$Foo$.equals(main.scala:5)
at Playground$Foo$.equals(main.scala:5)
at Playground$Foo$.equals(main.scala:5)
at Playground$Foo$.equals(main.scala:5)
at Playground$Foo$.equals(main.scala:5)
at Playground$Foo$.equals(main.scala:5)
at Playground$Foo$.equals(main.scala:5)
at Playground$Foo$.equals(main.scala:5)
at Playground$Foo$.equals(main.scala:5)
at Playground$Foo$.equals(main.scala:5)
at Playground$Foo$.equals(main.scala:5)
at Playground$Foo$.equals(main.scala:5)
at Playground$Foo$.equals(main.scala:5)
at Playground$Foo$.equals(main.scala:5)
at Playground$Foo$.equals(main.scala:5)Expectation
To compile and run as expected
Notes
A similar pattern is used by the stdlib in:
scala3/library/src/scala/collection/immutable/IntMap.scala
Lines 61 to 71 in 48bc891
| private[immutable] case object Nil extends IntMap[Nothing] { | |
| // Important! Without this equals method in place, an infinite | |
| // loop from Map.equals => size => pattern-match-on-Nil => equals | |
| // develops. Case objects and custom equality don't mix without | |
| // careful handling. | |
| override def equals(that : Any) = that match { | |
| case _: this.type => true | |
| case _: IntMap[_] => false // The only empty IntMaps are eq Nil | |
| case _ => super.equals(that) | |
| } | |
| } |
He-Pin