Scala中的注入隐式ITS
我有以下特点:Scala中的注入隐式ITS,scala,implicit,Scala,Implicit,我有以下特点: 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
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
。我原以为我们已经将vali
致命地初始化为0
,但编译器发现我们有一个实例,它将隐式vali:Int
重写为123
的值
现在我对这种情况下的隐性解决感到困惑。你能解释一下吗?
trait Ctx{tr:Tr1
这是一种自我类型,意味着它需要Tr1
才能Ctx
像扩展它,并且隐式[Int]
它试图找到一个隐式Int变量。由于Tr1
定义了一个隐式vali变量,因此编译器可以推断隐式[Int]
在当前范围内是隐式vali
因此,当您重写implicit val i:Int=123
时,test
方法将返回123