2016-08-03 74 views
1

在下面簡單的例子我沒有編譯錯誤:爲什麼隱式[ClassTag [T]]成功解析?

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

簡而言之,它是在ClassTag伴侶對象中定義的。您還可以查找基本類型的其他定義,例如布爾值或Char。 – hasumedic

回答

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]的 隱式參數,並且將重寫方法到 看起來像前面的 部分中的隱式參數一樣。

相關問題