私はScalaに比較的新しいので、ジェネリックオブジェクトメソッドを定義しようとしています。しかし、メソッド内でパラメータ化された型を参照すると、 "Tに使用できるClassTagがありません。"問題を説明するための不自然な例です。
scala> def foo[T](count: Int, value: T): Array[T] = Array.fill[T](count)(value)
<console>:7: error: No ClassTag available for T
def foo[T](count: Int, value: T): Array[T] = Array.fill[T](count)(value)
^
ここで何が間違っているのか、そしてこの不自然な例を機能させる方法を理解するのに助けてくれてありがとう。
汎用コンテキストで配列をインスタンス化するには(T
の配列をインスタンス化するには、T
は型パラメーターです)、Scalaは実行時にT
、タイプClassTag[T]
の暗黙的な値の形式で具体的には、このClassTag
値を(暗黙的に)渡すためにメソッドの呼び出し元が必要です。これはcontext bound:
def foo[T:ClassTag](count: Int, value: T): Array[T] = Array.fill[T](count)(value)
この状況の(完全な)説明については、次のドキュメントを参照してください。
http://docs.scala-lang.org/sips/completed/scala-2-8-arrays.html
(簡単に言うと、ClassTagsはClassManifestsの実装を作り直したものなので、その根拠は残っています)