Я работал над примерами кода из главы «Особенности в программировании в 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
Может кто-нибудь помочь объяснить, почему нет ошибки компиляции в первом случае.