Warum die implizite Konvertierung in Listen nicht funktioniert?

8

Könnte jemand eine kurze Erklärung geben, warum die implizite Konvertierung in diesen Fällen nicht funktioniert? Danke.

%Vor%     
Luigi Plinge 18.07.2011, 06:13
quelle

2 Antworten

7

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

%Vor%

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

%Vor%

Es funktioniert, aber das Ergebnis ist ein String.

    
paradigmatic 18.07.2011, 07:23
quelle
4

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 ...

durchführen würden

In all diesen Fällen besteht die einfache Möglichkeit darin, .map(stringToInt) vorher explizit auf Ihre Sammlung zu setzen.

    
Jean-Philippe Pellet 18.07.2011 07:22
quelle

Tags und Links