[解決済み] ScalaのManifestとは何か、いつ必要なのか?
質問
Scala 2.7.2以降、Scalaには
Manifest
というものがあり,これは Java の型消去を回避するものです.しかし,どのようにして
Manifest
は正確にどのように機能し、なぜ/いつそれを使う必要があるのでしょうか?
ブログの記事 マニフェスト。再定義された型 Jorge Ortiz 氏による解説はその一部ですが、これを コンテキスト境界 .
また
ClassManifest
とは何が違うのでしょうか?
Manifest
?
私は、マニフェストを使用することによってこれらを解決できると思いますが、正確な方法はわかりません。
どのように解決するのですか。
コンパイラーは、JVMランタイムが容易に表現できるよりも多くの型に関する情報を知っています。 マニフェストは、コンパイラが実行時に、失われた型情報についての異次元メッセージをコードに送信するための方法です。
これは、Kleptonian が化石記録や人間の DNA にエンコードされたメッセージを残した方法に似ています。 光速と重力共鳴場の制限により、彼らは直接通信することができません。 しかし、もし彼らのシグナルに同調する方法を知っていれば、昼食に何を食べるか、どのロト番号をプレイするかを決めるなど、想像もつかない方法で利益を得ることができます。
マニフェストが、あなたが見ているようなエラーに役立つかどうかは、もっと詳しく知らなければわかりません。
マニフェストの一般的な使用方法の1つは、コレクションの静的な型に基づいて、コードが異なる動作をするようにすることです。 たとえば、List[String]を他のタイプのListとは異なる方法で処理したいとしたらどうでしょう。
def foo[T](x: List[T])(implicit m: Manifest[T]) = {
if (m <:< manifest[String])
println("Hey, this list is full of strings")
else
println("Non-stringy list")
}
foo(List("one", "two")) // Hey, this list is full of strings
foo(List(1, 2)) // Non-stringy list
foo(List("one", 2)) // Non-stringy list
これに対するリフレクションベースの解決策は、おそらくリストの各要素を検査することでしょう。
コンテキストバウンドはscalaの型クラスを使うのに最も適していると思われ、Debasish Ghoshによってここでよく説明されています。 http://debasishg.blogspot.com/2010/06/scala-implicits-type-classes-here-i.html
コンテキストバウンズはまた、メソッドのシグネチャをより読みやすくすることができます。 例えば、上記の関数はコンテキストバウンズを使って次のように書き直すことができます。
def foo[T: Manifest](x: List[T]) = {
if (manifest[T] <:< manifest[String])
println("Hey, this list is full of strings")
else
println("Non-stringy list")
}
関連
-
[解決済み] java.lang.NoClassDefFoundError: scala/Product$class
-
[解決済み] expr() での lit() の使用について
-
[解決済み] AWSのためのScala SDKまたはインターフェースはありますか?
-
[解決済み] Scala: スライド(N,N) vs グループ化(N)
-
[解決済み] MapのmapValuesとtransformの違いについて
-
[解決済み] Scala : valへの再割り当て [重複].
-
[解決済み] Scalaのオブジェクトとクラスの違い
-
[解決済み] Scalaのapply関数とは何ですか?
-
[解決済み】Scalaのvarとvalの定義の違いは何ですか?
-
[解決済み] 型の論理和(ユニオン型)はどのように定義するのですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Scala subString関数
-
[解決済み] 実行時に変数の型を取得したい
-
[解決済み] Scalaの「コンテキストバウンド」とは何ですか?
-
[解決済み] Scalaで定期的に関数を実行する
-
[解決済み] sbtのlibraryDependenciesで言うところの++=と+=の違いは何ですか?
-
[解決済み】Scalaの記号演算子にはどんな意味があるの?
-
[解決済み】関数を定義する "def "と "val "の違いとは?
-
[解決済み] 型の論理和(ユニオン型)はどのように定義するのですか?
-
[解決済み] Spark SQLでカラムの降順でソートするには?
-
[解決済み】TypeTagとは何ですか、どのように使用するのですか?