首页 > 解决方案 > 为什么当 B 扩展 A 时,类型为 A 和 B 的范围内隐式值不模棱两可?

问题描述

为什么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
}

标签: scalaimplicitambiguous

解决方案


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

Test3 i1i2具有相同的类型A,所以这是歧义。

https://stackoverflow.com/a/57934397/5249621


推荐阅读