1. ホーム
  2. scala

Scala の汎用メソッド - T の ClassTag が利用できません。

2023-10-04 22:45:26

質問

私はScalaの比較的新しいユーザーで、一般的なオブジェクトメソッドを定義しようとしています。 しかし、メソッド内でパラメータ化された型を参照すると、"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 は型パラメータ)、Scalaは実行時に T の暗黙の値の形で,実行時に情報を持つ必要があります。 ClassTag[T] . 具体的には、メソッドの呼び出し側でこの ClassTag の値を渡す必要がありますが、これは便利なことに コンテキストバウンド :

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

この状況の (徹底的な) 説明は、このドキュメントを参照してください。

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

(簡単に言うと、ClassTagsはClassManifestsの再構築された実装であり、その根拠は残されています)