Scala 当B扩展A时,为什么范围内类型为A和B的隐式值不含糊?

Scala 当B扩展A时,为什么范围内类型为A和B的隐式值不含糊?,scala,implicit,ambiguous,Scala,Implicit,Ambiguous,为什么Test2中的代码会编译,尽管我们显然有不明确的隐式值 object Method { def foo(implicit i: A): Unit = println(i.i) } trait A { val i: Int } class B(override val i: Int) extends A object Test1 { implicit val i1: A = new A { val i: Int = 20 } } object Test2 {

为什么
Test2
中的代码会编译,尽管我们显然有不明确的隐式值


object Method {
  def foo(implicit i: A): Unit = println(i.i)
}

trait A {
  val i: Int
}
class B(override val i: Int) extends A

object Test1 {
  implicit val i1: A = new A {
    val i: Int = 20
  }
}

object Test2 {
  implicit val i2: B = new B(10)
  import Test1._
  // This compiles fine and prints 10
  Method.foo
}

object Test3 {
  implicit val i2: A = new B(10)
  import Test1._
  // This does not compile, get `ambiguous implicit values`
  Method.foo
}

Test2
中没有歧义
i2
i1
具有更具体的类型,因此
i2
i1
具有更高的优先级

Test3
i1
i2
具有相同的类型
A
,因此这是不明确的

在Test2中没有歧义,因为给定了隐式解析的规则。将选择最具体的一个。而
i2
i1
更具体,因为B扩展了A。另一方面,在Test3中存在无法解决的明显歧义。