Warum kompiliert das nicht?
Der angegebene Fehler ist class SomeElement needs to be abstract, since method eval in trait Element of type [T <: Typed]=> scala.util.Try[T] is not defined
Ich kann nicht verstehen, warum die Methode eval
, die auf SomeElement definiert ist, die Typabhängigkeiten nicht erfüllt.
Wie ich es verstehe, sollte eval
etwas zurückgeben, das in einem Try
enthalten ist, welches die Unterklassen Typed
enthält.
Try ist in seinem Typparameter kovariant. Die Implementierung von eval
in SomeElement
gibt eine NumberLike
und NumberLike
Unterklassen Typed
zurück. Also, was ist falsch gelaufen?
Das Hinzufügen eines expliziten Typparameters zu eval in SomeElement
hilft auch nicht:
Wenn Sie die Definition von SomeElement auf das obige ändern, erhalten Sie:
%Vor%BEARBEITEN Ich würde wirklich gerne wissen warum das nicht kompiliert. Problemumgehungen für das Problem sind hilfreich, aber ich möchte wirklich wissen, was hier vor sich geht.
Der Typparameter T
wird für die Funktion definiert, nicht für den umschließenden Typ Element
, er kann nicht durch Vererbung 'gelöscht' werden und muss in der übergeordneten Funktion beibehalten werden ( Ссылка ).
Wenn Sie den Typparameter in Element
definition verschieben, funktioniert er folgendermaßen:
Oder verwenden Sie einen Typ member:
%Vor%Da jemand eine Lösung gegeben hat, versuche ich zu erklären warum.
In Java ist so etwas illegal:
%Vor%Aber in Scala ist es legal:
%Vor%Der Hauptunterschied ist, dass: scala treat 2 Methoden mit dem gleichen Namen und Parameterliste unterschiedlich ist, wenn eine von ihnen einen Typparameter hat und eine andere nicht (Ich denke, dass die Signatur der Scala-Methode Typparameter enthält, korrigiere mich, wenn ich es war falsch :))
In Ihrem Fall können Sie also eine Methode mit type-Parameter nicht mit einer normalen Methode überschreiben (sie haben unterschiedliche Signaturen)
Ich bin mir nicht sicher, welches besser ist, persönlich bevorzuge ich die Scala-Regel:)