Я только что столкнулся с очень странным поведением в модификациях стека Scala.
Давайте посмотрим пример:
class Base extends Function0[Unit] {
override def apply(): Unit = println("base")
}
trait Modification extends Function0[Unit] {
abstract override def apply(): Unit = { print("modified "); super.apply() }
}
val a = new Base with Modification
a.apply()
Я ожидаю, что результат будет похож на modified base
. Вместо этого я получил modified modified modified...
, в результате чего StackOverflowError
Что интересно, это происходит только с Function0 [Unit]. Функция [String] работает нормально:
class Base extends Function0[String] {
override def apply(): String = "base"
}
trait Modification extends Function0[String] {
abstract override def apply(): String = "modified " + super.apply()
}
val a = new Base with Modification
a.apply()
Вывод:
defined class Base
defined trait Modification
a: Base with Modification = <function0>
res0: String = modified base
Может кто-нибудь объяснить, пожалуйста, такое поведение?