2017-06-01 2 views
2

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 :)

Antwort

5

Wenn Sie class B[Any] tun, definieren Sie eine Klasse mit einem Typparameter namens Any. Verwechseln Sie den Namen des Typparameters nicht mit der tatsächlichen Klasse Any. Sie überschatten nur ihren Namen.

Sie könnten genauso fein wie folgt vorgehen:

class B[Int] 
val obj = new B[String] 

Sie sehen können, warum es schlechte Praxis zu Nameart Parameter nach tatsächlichen Typen ist. In der Regel verwenden Menschen Namen mit einem einzigen Buchstaben für ihre Typparameter wie folgt:

class B[T] // I just changed the name of the type parameter from "Int" to "T". 
val obj = new B[String] 
+0

Ah, vielen Dank. Das macht eine ganze Menge Sinn jetzt - was für eine hinterhältige Frage :) – CowNorris

+0

@ user2938375 Bitte geben Sie die Antwort akzeptieren. – marstran

+0

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