Angenommen, ich habe zwei Klassen, Input
und Output
, die so konzipiert sind, dass sie miteinander verbunden sind. Output
erzeugt Werte eines Typs und Input
verwendet sie.
Es ist in Ordnung, wenn ein Paar Input
und Output
nicht mit demselben Wert arbeitet, solange der Parameter Input
type ein Supertyp des Parameters Output
type ist. Beachten Sie, dass der Typparameter in beiden Klassen invariant ist. in den realen Versionen wird es sowohl in ko- als auch kontravarianten Positionen verwendet.
Ich habe eine connect
Methode woanders, die eine Verbindung zwischen einem Input
/ Output
Paar herstellt:
Wenn ich diese Methode wie folgt aufrufen, erhalte ich einen Typfehler:
%Vor%Der Fehler ist:
%Vor% Ich kann das lösen, indem ich den type-Parameter ausschreibe (in diesem Fall würde ich connect[String]
schreiben, aber ich denke, der Compiler sollte das für mich herausfinden können. Wie kann ich die Methode connect
so ändern dass der Typparameter automatisch abgeleitet wird?
Bearbeiten: Im Moment habe ich connect
zu einer Methode von Output
gemacht, so dass der Typparameter automatisch abgerufen wird. Dies hat auch den zusätzlichen Vorteil, dass ich die Infix-Notation out connect in
verwenden kann, aber das Design fühlt sich etwas peinlich an.
Ich bin immer noch daran interessiert, warum der Compiler dieses Verhalten zeigt. Ich denke, es sollte in der Lage sein, den Typparameter abzuleiten. Funktioniert das tatsächlich wie angegeben?
Ich mag völlig falsch liegen, aber ich denke, das Problem ist, wenn Sie die Eingabe und die Ausgabe zusammenfügen: Die Eingabe hat eine Ausgabe, die auf einen Subtyp von T beschränkt ist, aber die Ausgabe hat eine Eingabe, die auf einen Supertyp von T beschränkt ist, der einzige Typ, der beide Bedingungen erfüllen kann, ist T.
%Vor%Wenn Sie die Eingabe mit der Ausgabe erstellen (indem Sie Q durch _ & lt ;: T ersetzen), erhalten Sie:
%Vor%Das Gleiche wie
Eingabe [T] - & gt; Eingabe [_ & lt ;: T & lt; _]
Daher die Typabweichung
Eigentlich kann scala type inferene die "Rekursion" vorerst nicht verarbeiten. Also, wenn Art des Arguments nur in Kollokation mit anderen Argument scala fehlschlagen kann, um Schlussfolgerung. Wenn Sie jedoch eine andere Argumentliste verwenden, wird scala f(a)(b)(c,d)
Typen nach Liste ableiten, so dass es normalerweise besser funktioniert.
PS Es ist sehr vereinfacht, kann Ihnen aber einen Hinweis geben.
Tags und Links scala generics types type-inference