1. ホーム
  2. scala

[解決済み] ScalaのManifestとは何か、いつ必要なのか?

2022-06-14 05:09:46

質問

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")
  }