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

时间:2016-08-03 14:15:53

标签: scala implicit

在以下最简单的示例中,我没有编译错误:

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]来自哪里?

1 个答案:

答案 0 :(得分:2)

:符号定义上下文绑定,这意味着编译器必须在其隐式作用域中具有ClassTag[T]的实例。它的语法糖如下:

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

然后,对implicitly的调用将$ev作为必需的实例。

但这当然会进一步推动这个问题:$ev(证据)来自哪里?引用the Scala documentation(引用TypeTag,但同样适用于ClassTag):

  

给定上下文绑定[T:TypeTag],编译器将简单地生成一个   TypeTag [T]类型的隐式参数,并将该方法重写为   看起来像前面的隐含参数的示例   部分。