Scala mehrere implizite Konvertierungen?

8

Ich verstehe das scheinbar widersprüchliche Verhalten nicht, das ich im folgenden Code sehe (Scala 2.9):

%Vor%

Die Zeile '5.0.pluss (Some (5.0))' kompiliert, aber die Zeile danach kompiliert nicht mit der folgenden Fehlermeldung:

  

Überladener Methodenwert & lt; mit Alternativen: (x: Double) Boolean (x: Float) Boolean (x: Lang) Boolean (x: Int) Boolean (x: Char) Boolean (x: Kurz) Boolean (x: Byte) Boolean kann nicht angewendet werden ( Einige [Double])

Wenn ich explizite & lt; Operator zu der Pimp-Klasse, die eine Option [Double]:

%Vor%

Alles wird gut zusammengestellt.

Nun, so wie ich Scala implizite Konvertierungsregeln verstehe, macht das durchaus Sinn:

  1. Der Compiler versteht, dass es kein '& lt;' operator on Double, das Option [Double]
  2. akzeptiert
  3. Es berücksichtigt die implizite Konvertierung in Pimp1.
  4. Wenn Pimp1 einen geeigneten Operator hat, funktioniert es, andernfalls erzeugt es einen Fehler.
  5. Dies zeigt, dass der Compiler nicht eine zweite (verfügbare) implizite Konvertierung von Option [Double] auf Pimp.
  6. anwendet

So habe ich erwartet, dass die Dinge funktionieren.

Dies scheint jedoch dem ersten Beispiel zu widersprechen, wo:

  1. Der Compiler sieht, dass es bei Double keine Plus-Methode gibt.
  2. Der Compiler versucht die implizite Konvertierung nach Pimp, die eine solche Methode hat.
  3. Um jedoch den Operator zum Arbeiten zu bringen, muss der Compiler eine zweite implizite Konvertierung auf das Argument anwenden, um es in Pimp umzuwandeln.

Gemäß der obigen Logik sollte dies nicht kompiliert werden, tut es aber. Berücksichtigen die impliziten Konvertierungsregeln nicht vorhandene Methoden und nicht übereinstimmende Methoden anders?

    
Or Peles 04.10.2012, 16:08
quelle

1 Antwort

5

Das macht für mich Sinn. Der erste funktioniert so:

Hat Double eine Plus-Methode? Nein, können wir es implizit in etwas umwandeln, das funktioniert? Ja. Ok, jetzt möchte ich die Plus-Methode anwenden. Braucht es eine Option? Nein. Kann ich die Option implizit in etwas umwandeln, das sie benötigt? Ja.

Der zweite geht so:

Hat Double ein & lt; Methode? Ja. Braucht es eine Option? Nein. Kann ich Option implizit in etwas umwandeln, das & lt; dauert? Nein.

    
stew 04.10.2012 20:27
quelle

Tags und Links