Auf ein neues Arbeitsblatt ich fragte mit der Frage vorgelegt, was die Ausgabe des folgenden Code wäre:Klärung über Scala Polymorphismus
class A { def m(x:Double) = x+x }
class B[Any] extends A{ def m(x: Any) = print(x) }
class C[Any] { def m (x:Double) = x+x; def m (x: Any) = print(x) }
val obj1 = new B[Int]; val obj2 = new C[Any]
obj1.m(1); obj1.m(2.3); obj2.m(4); obj2.m(5.6)
ich ziemlich verwirrt bin, was auf dem Platz einen konkreten Typ mit Klammern nach dem Klassennamen würden bedeuten (zB class B[Any]
). Ist der spätere Ausdruck val obj1 = new B[Int]
gültig, da Int <: Any
, Int eine Unterklasse von Allen zu sein?
Wenn das Code-Snippet später ausgeführt wurde, wurde das Ergebnis einfach "1" gedruckt. Dies war nicht das, was ich erwartet hatte den Aufruf an obj.m(2.3)
bei def m(x: any)
zu lösen, wo es in Wirklichkeit scheint der Compiler ging bis zu A und rief die m
in class A
. Die späteren Ausdrücke obj2.m(4)
und obj2.m(5.6)
scheinen sinnvoll zu sein, da sowohl 4 als auch 5,6 in der Funktion mit def m(x: Double)
landen würden.
In welcher Reihenfolge traversiert der Compiler genau, um herauszufinden, was er nennen soll? Ich wäre sehr dankbar, wenn jemand meine Verwechslungen mit Scala, wie Polymorphie hier behandelt wird, klären würde, vielen Dank :)
Ah, vielen Dank. Das macht eine ganze Menge Sinn jetzt - was für eine hinterhältige Frage :) – CowNorris
@ user2938375 Bitte geben Sie die Antwort akzeptieren. – marstran
Oh, noch eine Sache - funktioniert der Any innerhalb der Funktionsparameter in diesem Fall wie "T" oder bezieht er sich auf den tatsächlichen Typ Any? Ich konnte es damals nicht akzeptieren, da es ein Zeitlimit gab – CowNorris