2016-08-03 8 views
1

は、私はコンパイルエラーを持っていません。しかし、implicitly[ClassTag[T]]呼び出しでタイプClassTag[T]のオブジェクトが見つかるのはなぜ分かりませんか?私がしたのはジェネリック型引数を提供することだけでした。 ClassTag[Int]はどこから来たのですか?[ClassTag [T]]が暗黙的に解決するのはなぜですか?</p> <pre><code>object App { def main(args: Array[String]) = { test[Int]() } def test[T <: Int : ClassTag]() = println(implicitly[ClassTag[T]]) } </code></pre> <p>プログラムプリント<code>Int</code>次の最も単純な例で

+0

簡単な答えは、ClassTagコンパニオンオブジェクトで定義されています。また、BooleanやCharなどのプリミティブ型の他の定義を見つけることもできます。 – hasumedic

答えて

2

:シンボルは、コンテキストバインドを定義しています。つまり、コンパイラは暗黙のスコープでClassTag[T]というインスタンスを持つ必要があります。これは、次のシンタックスシュガーです:

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

implicitlyへの呼び出しは、必要なインスタンスとして$evがかかります。

しかし、これはもちろん、質問をもう少しプッシュします:$ev(証拠)はどこから来たのですか? (TypeTagを参照するが、同じことがClassTagに適用されます)the Scala documentationを引用すると:

は[T:TypeTag]バインド状況を考えると、コンパイラは単にタイプTypeTag [T]の 暗黙のパラメータを生成し、書き換えますメソッドを に変更すると、前の セクションの暗黙的なパラメータの例のようになります。

関連する問題