Frage zum Scala impliziten Konvertierungen Nicht Zweideutigkeit
-
09-10-2019 - |
Frage
Könnte mir jemand folgende Situation mit Scala impliziten Konvertierungen Mechanismus erklären. Es gibt einen Code:
object Main {
implicit val x:Int => String = v => "val"
implicit def y(v:Int) = "def"
def p(s:String) = print(s)
def main(args: Array[String]): Unit = {
p(1)
}
}
Dieser Code druckt "val". Aber wenn ich zweite Zeile Kommentar:
//implicit val x:Int => String = v => "val"
Code druckt "def".
So beide impliziten Konvertierungen (x und y) in dieser Situation möglich sind. Es gibt eine Nicht-Zweideutigkeit - eine implizite Konvertierung nur eingeführt wird, wenn es keine andere mögliche Umwandlung ist einzufügen. Nach dieser Regel soll dieser Code überhaupt nicht kompiliert werden. Aber der Code erfolgreich kompiliert und ausgeführt. Was verstehe ich nicht?
Danke.
Lösung
The reason for this is stated in the Scala Language Specification section 6.26.2.
Before the method can be treated as a function it needs to be converted to one by performing eta-expansion. Thus one more implicit conversion would have to be applied and so the val
is chosen.
UPDATE: removed flawed example.
Evaluation of a method without parameters is always performed implicitly.