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