考虑以下代码:
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
在范围内覆盖方法参数,因为它们具有相同的名称。