5

考虑以下代码:

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错误。当然barambiguous 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在范围内覆盖方法参数,因为它们具有相同的名称。

4

1 回答 1

1

注意:我可能过于简单化了一些东西,但在测试中它似乎如下所示。

这是因为第二个在内部范围内,所以它具有优先级。它与发生的事情相同

object test {
 val a = 5
 def test(i: Int) = {
   val a  = 6
   i + a
 }
}

在这种情况下,您希望a在函数内为 6。以下类似。

object test {
  implicit val i = 5; 
  { 
    implicit val b = 6; 
    test
  } 
  def test(implicit ii:Int) = println(ii)
} 

从评论更新。

scala> def test(a: Int) = {val a = 5; a }
test: (a: Int)Int

scala> test(6)
res1: Int = 5
于 2012-11-23T09:59:45.100 回答