Betrachten Sie den folgenden Code ein:Eindeutiges Subimplicits
class A { def print = println("A") }
class B extends A { override def print = println("B") }
def foo(implicit a: A) = a.print
def bar(implicit a: A) = {
implicit val b = new B
foo
}
bar(new A) // B
Ich frage mich, warum ruft foo
in bar
ist kein ambiguous implicit values
Fehler zu erhöhen. Natürlich
implicit val b: A = new B
wird diesen Fehler erhöhen. Warum wählt foo
das implizite b
und nicht das implizite a
? Oder noch allgemeiner: Was sind die Regeln, die ausgewählt werden?
EDIT:
Aufgrund meines Kommentars-Gespräch mit Ivan ich klarstellen möchte: Ich würde die Antwort auf meine Frage, ob ich die lokale implizite val die gleiche Art und Weise wie die implizite Methodenparameter genannt.
def bar(implicit a: A) = {
implicit val a = new B
foo
}
Dann nur die lokale val a
ist in ihrem Umfang, die den Methodenparameter Anwendungsbereich-Vorrang, weil sie den gleichen Namen haben.
möglich Duplikat [Wo sieht Scala für implicits?] (Http://stackoverflow.com/questions/5598085/where-does-scala-look-for-implicits) –
Siehe auch http: // eed3si9n.com/implicit-parameter-precedence- again (aus dieser Frage heraus verlinkt). –