我有以下特点:
trait Tr1 {
implicit val i: Int
}
trait Ctx { tr: Tr1 =>
def test: Int = implicitly[Int]
}
现在我按照以下方式运行我的应用程序:
def main(args: Array[String]): Unit = {
val ctx: Ctx = new Ctx with Tr1 {
override implicit val i: Int = 123
}
println(ctx.test) //prints 123!!!
}
令人惊讶的是它会打印123
。我认为我们val i
已经窘迫地初始化为0
,但编译器发现我们已经将实例覆盖implicit val i: Int
到值123
。
现在我对这种情况下的隐式解决方案感到困惑。你能取悦吗?
答案 0 :(得分:1)
trait Ctx { tr: Tr1
这是自我类型,这意味着它需要Tr1
Ctx
extend
,implicitly[Int]
它是Tr1
试图找到隐含的Int 变量。由于implicitly[Int]
定义了一个隐式val i 变量,因此编译器可以推断implicit val i: Int = 123
当前是隐式val i 范围。
因此,当您覆盖test
时,123
方法将返回map(a).map(b)
。