2013-06-04 10 views
47

私はScalaには比較的新しく、一般的なオブジェクトメソッドを定義しようとしています。しかし、メソッド内でパラメータ化された型を参照すると、「TにClassTagを使用できません」というメッセージが表示されます。ここに問題を説明するための人為的な例があります。ここで間違って、どのようにこの不自然な例を動作させるために何であるかを理解する上で助けを事前にスカラの一般的なメソッド - No ClassTag available for T

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の配列をインスタンス)の配列をインスタンス化する

答えて

59

、スカラ型ClassTag[T]の暗黙値の形で、Tについての実行時の情報を有する必要があります。これを参照してください、このような状況の(徹底的に)説明については

def foo[T:ClassTag](count: Int, value: T): Array[T] = Array.fill[T](count)(value) 

: は具体的に、あなたは便利をバインドコンテキストを使用して行うことができ、このClassTag値を渡す(暗黙的)に、あなたのメソッドの呼び出し元を必要としますドキュメント:

http://docs.scala-lang.org/sips/completed/scala-2-8-arrays.html

(根拠が残っているので、すぐにそれを置くために、ClassTagsは、ClassManifestsのリワーク実装されている)

+8

魅力的な。 'import scala.reflect.ClassTag'ではこれが動作します。ありがとう。 – Chuck

+3

ClassManifestsが廃止されているので、人々はこれを知っているかもしれません - http://docs.scala-lang.org/overviews/reflection/typetags-manifests.html - – Chuck

+0

関数本体でT型の2つの値を比較すると、 'ClassTag'アノテーションに加えて'暗黙の '発注者パラメータが必要です。 – AlvaPan

関連する問題