Polymorpher Scala-Rückgabetyp

8

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.

    
W.P. McNeill 06.02.2013, 23:43
quelle

2 Antworten

15

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 .

    
Travis Brown 07.02.2013, 00:29
quelle
8
___ qstnhdr ___ Polymorpher Scala-Rückgabetyp ___ tag123scala ___ Scala ist eine universelle Programmiersprache, die hauptsächlich auf die Java Virtual Machine abzielt. Entwickelt, um gängige Programmiermuster in einer prägnanten, eleganten und typsicheren Weise auszudrücken, vereint es sowohl imperative als auch funktionale Programmierstile. Seine Hauptmerkmale sind: fortgeschrittenes statisches System mit Typinferenz; Funktionstypen; Muster-Matching; implizite Parameter und Konvertierungen; Überlastung des Bedieners; volle Interoperabilität mit Java; Nebenläufigkeit ___ ___ tag123generics Generics sind eine Form von parametrischem Polymorphismus in einer Reihe von Sprachen gefunden, einschließlich .NET-Sprachen, Java und in Swift. ___ answer 14755312 ___

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

%Vor%

Nun, wenn alles, was Sie als Implementierungen von Base haben wollen, Fallklassen sind, können Sie dies direkt durch eine Selbsttypgrenze erreichen:

%Vor%     
___ tag123polymorphism ___ In der Informatik ist Polymorphie eine Programmiersprache, mit der Werte verschiedener Datentypen einheitlich behandelt werden können. ___ tag123returntype ___ ist für Fragen zuständig, die sich auf den Typ der Variablen oder den von einer Funktion zurückgegebenen Wert beziehen. ___ qstntxt ___

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.

    
___ answer14741535 ___

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% .

    
___
Eduardo Pareja Tobes 07.02.2013 15:53
quelle