Sie können den Typ direkt in der Methode A
angeben, anstatt den zusätzlichen Satz von Klammern / Klammern und den Typ Annotation hinzufügen zu müssen:
Warum die Typinferenz fehlschlägt, finden Sie in den folgenden Fragen:
Aktualisierung:
Ich entschuldige mich, meine voreilige Antwort war weit weg. Das Problem in den obigen Beiträgen steht nicht wirklich mit diesem Problem in Zusammenhang. @TravisBrown hat in seinem Kommentar oben einen sehr guten Punkt gemacht. Dies scheint zunächst zu funktionieren:
%Vor%Aber wenn Sie tatsächlich versuchen, den Konstruktor aufzurufen, schlägt dies an der Verwendungsstelle fehl:
%Vor% Dies legt nahe, dass der Compiler den Default-Parameter nicht für alle Nothing
gültig macht, nur für einige List
. Sie haben wahrscheinlich diese Wahl getroffen, damit Sie so etwas tun können:
Jede Art der Verschachtelung mit dem parametrisierten Typ kann jedoch keine Überprüfung an der Deklarationsstelle im Konstruktor eingeben:
%Vor%Die Inferenz schlägt nicht fehl, wenn sich der Typparameter in einer kovarianten Position befindet:
%Vor%Diese funktionieren, weil der Compiler standardmäßig %code% als kovarianten Typ auswählt. Dies funktioniert gut für %code% , aber das zweite obige Beispiel funktioniert nicht, wenn Sie tatsächlich versuchen, es aufzurufen.
Der Grund für die meisten dieser Seltsamkeit ist wahrscheinlich die Art und Weise, wie Scala Standardargumente behandelt. Der Compiler fügt dem Companion-Objekt automatisch eine zusätzliche Methode hinzu, und an der Stelle, an der Sie kein Argument angeben, fügt der Compiler automatisch der neuen Methode im Companion-Objekt einen Methodenaufruf hinzu, um stattdessen das fehlende Argument zu generieren. Es sieht so aus, als würde das Abstrahieren des Standardarguments in eine Methode einige Dinge in der Typinferenz, die mit einer normalen Zuweisung funktionieren würden, unterbrechen.
Ich denke, die meisten dieser Ergebnisse sind ziemlich verwirrend. Was ich davon wegnehme ist, dass es wichtig ist, deine Standardparameter zu testen, um sicher zu gehen, dass sie die Typkorrektheit nicht brechen, wenn du sie verwendest!