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中存在无法解决的明显歧义。