Ich habe eine abstrakte Scala-Klasse Base
mit den Unterklassen Derived1
und Derived2
. Base
definiert eine Funktion f (), die ein Objekt desselben Typs wie seine implementierende Klasse zurückgibt. So liefert Derived1.f()
Derived1
und Derived2.f()
gibt Derived2
zurück. Wie schreibe ich das in Scala?
Hier ist, was ich bisher herausgefunden habe.
%Vor%Das gibt die folgenden Compilerfehler:
%Vor% Diese Fehlermeldung ist für mich verwirrend, weil ich denke, com.github.wpm.cancan.Derived1
sollte in diesem Zusammenhang gleich Derived1
sein.
Randall Schulz wies auf einen der Gründe hin, warum dein aktueller Code nicht funktioniert. Es ist jedoch möglich, mit F -gebundenem Polymorphismus zu bekommen, was Sie wollen:
%Vor% Mit dem Typparameter des Basismerkmals können Sie über die implementierende Klasse sprechen, z. im Rückgabetyp für f
.
Nur um eine kleine Genauigkeit hinzuzufügen (perfekt gut) Travis Brown Antwort: Es ist nicht das C
in trait Base[C <: Base[C]]
Lassen Sie uns auf die implementierende Klasse verweisen; Es bleibt nur bei der Konvention, subclass extends Base[subclass]
zu schreiben, damit ihr es macht. Es gibt keine Möglichkeit, dass ich mich auf diesen Typ beziehe. Um zu verdeutlichen, was ich meine, kompiliert
Nun, wenn alles, was Sie als Implementierungen von Base
haben wollen, Fallklassen sind, können Sie dies direkt durch eine Selbsttypgrenze erreichen:
Ich habe eine abstrakte Scala-Klasse %code% mit den Unterklassen %code% und %code% . %code% definiert eine Funktion f (), die ein Objekt desselben Typs wie seine implementierende Klasse zurückgibt. So liefert %code% %code% und %code% gibt %code% zurück. Wie schreibe ich das in Scala?
Hier ist, was ich bisher herausgefunden habe.
%Vor%Das gibt die folgenden Compilerfehler:
%Vor%Diese Fehlermeldung ist für mich verwirrend, weil ich denke, %code% sollte in diesem Zusammenhang gleich %code% sein.
Randall Schulz wies auf einen der Gründe hin, warum dein aktueller Code nicht funktioniert. Es ist jedoch möglich, mit F -gebundenem Polymorphismus zu bekommen, was Sie wollen:
%Vor%Mit dem Typparameter des Basismerkmals können Sie über die implementierende Klasse sprechen, z. im Rückgabetyp für %code% .
Tags und Links scala generics polymorphism return-type