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の再構築された実装であり、その根拠は残されています)
関連
-
[解決済み] リフレクションを使ってジェネリックメソッドを呼び出すにはどうしたらいいですか?
-
[解決済み] Javaで汎用配列を作成する方法は?
-
[解決済み] 汎用型Tのクラスインスタンスを取得する方法を教えてください。
-
[解決済み] 汎用クラスやメソッドのメンバからTの型を取得する方法
-
[解決済み] Scalaのオブジェクトとクラスの違い
-
[解決済み] メソッドの戻り値の型を汎用的にするにはどうすればよいですか?
-
[解決済み] C#でジェネリックメソッドからNULLを返すにはどうしたらいいですか?
-
[解決済み】TをEnumに拘束するGenericメソッドの作成
-
[解決済み] ジッパーがコモナドである理由を理解する
-
[解決済み] build.sbtとbuild.scalaの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 依存するメソッドタイプの説得力のある使用例とは?
-
[解決済み] リスト[Option]からNoneを除外するには?
-
[解決済み] ジッパーがコモナドである理由を理解する
-
[解決済み] Scalaにおけるval-mutableとvar-immutableの比較
-
[解決済み] 末尾再帰関数が最適化されるためのScalaアノテーションは何ですか?
-
[解決済み] Scalaのtraitでvalとdefの使い分けは?
-
[解決済み] アブストラクトオーバーとはどういう意味ですか?
-
[解決済み] フォールドの早期中止
-
[解決済み] パッケージオブジェクト
-
[解決済み] コレクションのGroovyマップメソッド