为什么 implicitly[ClassTag[T]] 解析成功?

Why does implicitly[ClassTag[T]] resolve successfully?

在下面最简单的例子中我没有编译错误:

object App {
  def main(args: Array[String]) = {
    test[Int]()
  }
  def test[T <: Int : ClassTag]() = println(implicitly[ClassTag[T]])
}

程序打印 Int。但是我不明白为什么可以找到类型为ClassTag[T]的对象用于implicitly[ClassTag[T]]调用?我唯一做的就是提供通用类型参数。 ClassTag[Int] 从哪里来?

: 符号定义了一个 上下文绑定 ,这意味着编译器必须在其隐式范围内有一个 ClassTag[T] 的实例。它是以下内容的语法糖:

def test[T <: Int]()(implicit $ev: ClassTag[T]) = println(implicitly[ClassTag[T]])

implicitly 的调用将把 $ev 作为所需的实例。

但这当然将问题推得更远:$ev(证据)从何而来?引用the Scala documentation(指TypeTag,但同样适用于ClassTag):

Given context bound [T: TypeTag], the compiler will simply generate an implicit parameter of type TypeTag[T] and will rewrite the method to look like the example with the implicit parameter in the previous section.