请考虑以下代码:
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 = new B
foo
}
Run Code Online (Sandbox Code Playgroud)
然后只有本地val a在范围内 - 覆盖方法参数,因为它们具有相同的名称.
注意:我可能过于简单化了事情,但在测试中它看起来像下面这样。
因为第二个是在内部范围内,所以它具有优先级。发生的事情是一样的
object test {
val a = 5
def test(i: Int) = {
val a = 6
i + a
}
}
Run Code Online (Sandbox Code Playgroud)
在本例中,您预计a函数内的值为 6。以下类似。
object test {
implicit val i = 5;
{
implicit val b = 6;
test
}
def test(implicit ii:Int) = println(ii)
}
Run Code Online (Sandbox Code Playgroud)
从评论更新。
scala> def test(a: Int) = {val a = 5; a }
test: (a: Int)Int
scala> test(6)
res1: Int = 5
Run Code Online (Sandbox Code Playgroud)