Я працював над прикладами коду з глави "Особливості програмування" в Scala Edition1 https://www.artima.com/pins1ed/traits.html
і натрапив на дивну поведінку через мій друк. Хоча метод переосмислення ознаки нижче фрагмента коду не дає помилки компіляції, хоча типи повернення методу, що перекривається, відрізняються Unitвід String. Але після виклику методу на об'єкт він повертає Unit, але нічого не друкує.
trait Philosophical {
def philosophize = println("I consume memory, therefore I am!")
}
class Frog extends Philosophical {
override def toString = "green"
override def philosophize = "It aint easy to be " + toString + "!"
}
val frog = new Frog
//frog: Frog = green
frog.philosophize
// no message printed on console
val f = frog.philosophize
//f: Unit = ()
Але коли я надаю явний тип повернення в переосмисленому методі, він дає помилку компіляції:
class Frog extends Philosophical {
override def toString = "green"
override def philosophize: String = "It aint easy to be " + toString + "!"
}
override def philosophize: String = "It aint easy to be " + toString +
^
On line 3: error: incompatible type in overriding
def philosophize: Unit (defined in trait Philosophical);
found : => String
required: => Unit
Хто-небудь може допомогти пояснити, чому в першому випадку немає помилки компіляції.