2012-09-29 7 views
6

私はScalaのマニフェストの概念を学んでおり、単純なケースではそれを使う方法を基本的に理解しています。どんなパズルをするのですか?OptNanifestNoManifestは何ですか?私はそれまで使用されて見たことがない。誰かが、彼らが必要とされている/有用である例を挙げることはできますか?ScalaのOptManifestとNoManifestは何ですか?

(私はScalaの2.10 TypeTagsManifest秒の概念を置き換えますが、2.10は、我々はManifest Sを使用する必要があり、最終的になるまで、ことがわかります。)

答えて

6

は、我々は、以下のケースクラスと型の別名があるとします。

scala> case class Foo[A](a: A) 
defined class Foo 

scala> type F = Foo[_] 
defined type alias F 

我々ができるようになりました(ない非常に有効)タイプFのもののリストを作る:

scala> val foos: List[F] = List(Foo(1), Foo("a"), Foo('a)) 
foos: List[F] = List(Foo(1), Foo(a), Foo('a)) 

そして、我々は、配列にこれを回すことができます。

scala> foos.toArray 
res0: Array[F] = Array(Foo(1), Foo(a), Foo('a)) 

だから、はっきりコンパイラは、それがListtoArrayメソッドへの暗黙の引数として必要とマニフェストを見つけることができます。私たちはFのための昔ながらのManifestを求めるなら、我々はエラーを取得:

scala> manifest[F] 
<console>:11: error: overloaded method value classType with alternatives: 
    (prefix: scala.reflect.Manifest[_],clazz: Class[_],args: scala.reflect.Manifest[_]*)scala.reflect.Manifest[F] <and> 
    (clazz: Class[F],arg1: scala.reflect.Manifest[_],args: scala.reflect.Manifest[_]*)scala.reflect.Manifest[F] <and> 
    (clazz: Class[_])scala.reflect.Manifest[F] 
cannot be applied to (java.lang.Class[Foo[_$1]], scala.reflect.Manifest[_$1]) 
       manifest[F] 

だから、コンパイラは、当社のタイプの別名でワイルドカードを表現するためにマニフェストを使用してトラブルを抱えていることは明らかです。

理由がtoArrayであるのは、Manifestだけでなく、ClassManifestが必要なためです。実際にはClassManifestManifestのような型引数を表すためにを使用するため、Manifestのその他のものだけであるので、問題なくFClassManifestを得ることができます。 <?>NoManifestの文字列表現であることを

scala> classManifest[F] 
res2: ClassManifest[F] = Foo[<?>] 

。ここではNoneの役割を果たしています。Fの型引数について何も言わずに、コンパイラがタイプF(これは幸いなことに配列の作成に必要なすべてです)に関するクラス情報を表すことができます。それをモデル化する。

関連する問題