次のコードを検討してください。
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
なぜ電話をかけfooてもエラーが発生しbarないのか疑問に思いambiguous implicit valuesます。もちろん
implicit val b: A = new B
そのエラーが発生します。暗黙的ではなくfoo暗黙的を選択するのはなぜですか?またはさらに一般的:何が選ばれるのかというルールは何ですか?ba
編集:
Ivanとのコメント会話のため、明確にしたい:暗黙のメソッドパラメータと同じ方法でローカルの暗黙のvalに名前を付ければ、私の質問に対する答えがわかります。
def bar(implicit a: A) = {
implicit val a = new B
foo
}
次に、ローカルのみがval aスコープ内にあり、同じ名前であるため、メソッドパラメーターをスコープオーバーライドします。