Pracowałem nad przykładami kodu z rozdziału dotyczącego cech w programowaniu w Scala Edition1 https://www.artima.com/pins1ed/traits.html
i natknąłem się na dziwne zachowanie z powodu mojej literówki. Podczas gdy metoda przesłaniania cechy poniżej fragmentu kodu nie daje żadnego błędu kompilacji, chociaż typy zwracane przez przesłoniętą metodę są inne Unitniż String. Ale po wywołaniu metody na obiekcie zwraca Unit, ale nic nie drukuje.
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 = ()
Ale gdy podaję jawny typ zwrotu w przesłoniętej metodzie, pojawia się błąd kompilacji:
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
Czy ktoś może wyjaśnić, dlaczego w pierwszym przypadku nie wystąpił błąd kompilacji.