请考虑以下代码:
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
Run Code Online (Sandbox Code Playgroud)
我很奇怪,为什么呼吁foo在bar不提出一个ambiguous implicit values错误.当然
implicit val b: A = new B
Run Code Online (Sandbox Code Playgroud)
会引起这个错误.为什么foo选择隐式b而非隐式a?或者甚至更一般:将采取什么规则?
编辑:
由于我与Ivan的评论 - 我想澄清:如果我以与隐式方法参数相同的方式命名本地隐式val,我会知道我的问题的答案.
def bar(implicit a: A) = {
implicit val a …Run Code Online (Sandbox Code Playgroud)