Stavo lavorando attraverso gli esempi di codice del capitolo Tratti nella programmazione in Scala Edition1 https://www.artima.com/pins1ed/traits.html
e ho riscontrato un comportamento strano a causa del mio errore di battitura. Mentre il metodo di un tratto di sotto frammento di codice override non dà alcun errore di compilazione, anche se il tipo di ritorno del metodo sovrascritto è diverso Unit
vs String
. Ma chiamando il metodo su un oggetto restituisce Unità ma non stampa nulla.
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 = ()
Ma quando do il tipo di ritorno esplicito nel metodo override, dà un errore di compilazione:
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
Qualcuno può aiutare a spiegare perché nessun errore di compilazione nel primo caso.