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