Ich habe die Codebeispiele aus dem Kapitel über Merkmale in der Programmierung in Scala Edition1 https://www.artima.com/pins1ed/traits.html durchgearbeitet
und stieß wegen meines Tippfehlers auf ein komisches Verhalten. Während zwingende Methode eines Merkmal unter Code - Schnipsel gibt keine Kompilierung - Fehler , obwohl die Rückgabetypen der überschriebenen Methode unterscheidet Unit
vs String
. Beim Aufrufen der Methode für ein Objekt wird Unit zurückgegeben, es wird jedoch nichts gedruckt.
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 = ()
Wenn ich jedoch den expliziten Rückgabetyp in der überschriebenen Methode gebe, wird ein Kompilierungsfehler ausgegeben:
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
Kann mir jemand erklären, warum im ersten Fall kein Kompilierungsfehler vorliegt.