在以下最简单的示例中,我没有编译错误:
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]
来自哪里?
答案 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]类型的隐式参数,并将该方法重写为 看起来像前面的隐含参数的示例 部分。