Könnte jemand eine kurze Erklärung geben, warum die implizite Konvertierung in diesen Fällen nicht funktioniert? Danke.
%Vor%Ihre implizite Konvertierung konvertiert einen String in einen Int. In Ihrem ersten Beispiel wird es durch die Tatsache ausgelöst, dass Sie versuchen, Strings in eine Liste von Einsen zu setzen.
In Ihrem zweiten Beispiel haben Sie eine Liste von Zeichenketten und Sie rufen die Methode sum auf, die eine implizite Numeric[String]
verwendet. Ihre Konvertierung wird nicht angewendet, da Sie weder versuchen, einen String irgendwo zu übergeben, an dem der Compiler ein Int erwartet hat, noch Sie versucht haben, eine Methode aufzurufen, die in Int und nicht in String definiert ist. In diesem Fall können Sie entweder ein Numeric[String]
definieren, das explizit Ihre Konvertierung verwendet, oder eine Methode verwenden, die einen List[Int]
als Parameter verwendet (Hinweis für den Compiler):
Im dritten Beispiel muss das zweite Argument foldLeft vom Typ sein:
%Vor%Derjenige, den Sie tatsächlich passiert haben, ist vom Typ:
%Vor%Sie haben jedoch keine implizite Konvertierung zwischen diesen beiden Typen definiert. Aber:
%Vor%löst die Konvertierung aus und funktioniert.
Bearbeiten: So implementieren Sie Numeric[String]
:
Es funktioniert, aber das Ergebnis ist ein String.
Hier eine kurze Erklärung: Implizite Konvertierungen gelten für die Typen, von denen direkt und umgekehrt konvertiert werden (z. B. String
und Int
), und nicht für einen parametrisierten Typ T[String]
oder T[Int]
- es sei denn Implizite Konvertierungen wurden für T
selbst definiert, was für Listen nicht der Fall ist.
Ihre implizite Konvertierung gilt nicht in Ihren beiden Fällen (und selbst wenn Sie eine implizite Konvertierung von List[String]
nach List[Int]
hätten, würde dies nicht zutreffen). Es wird automatisch nur angewendet, wenn Sie einen Wert vom Typ Int
benötigen und stattdessen String
übergeben. Hier fragt im ersten Fall die Methode sum
nach einem impliziten Parameter Numeric[String]
- eine implizite Konvertierung von String
nach Int
kommt hier nicht zum Tragen.
Ähnliches Problem für Ihren nächsten Versuch: Das foldLeft
für Ihre Sammlung erfordert eine Funktion vom Typ (Int, String) => Int
. Stellen Sie sich die Unordnung vor, wenn wir aufgrund einer impliziten Konvertierung von String
nach Int
automatisch eine implizite Konvertierung von (Int, Int) => Int
nach (Int, String) => Int
...
In all diesen Fällen besteht die einfache Möglichkeit darin, .map(stringToInt)
vorher explizit auf Ihre Sammlung zu setzen.
Tags und Links scala implicit-conversion