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:
So habe ich erwartet, dass die Dinge funktionieren.
Dies scheint jedoch dem ersten Beispiel zu widersprechen, wo:
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?
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.
Tags und Links scala implicit-conversion