【发布时间】:2012-11-23 09:40:49
【问题描述】:
考虑以下代码:
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
我想知道为什么在bar 中调用foo 不会引发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 在范围内覆盖方法参数,因为它们具有相同的名称。
【问题讨论】: