为什么 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.
在下面最简单的例子中我没有编译错误:
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.