Warum glaubt scalac nicht, dass eine Methode nicht zur erforderlichen Typ-Signatur passt?

8

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?

%Vor%

Das Hinzufügen eines expliziten Typparameters zu eval in SomeElement hilft auch nicht:

%Vor%

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.

    
Squidly 28.08.2014, 14:19
quelle

2 Antworten

2

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:

%Vor%

Oder verwenden Sie einen Typ member:

%Vor%     
cchantep 28.08.2014 15:00
quelle
0

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

    
cloud 29.08.2014 05:59
quelle

Tags und Links