は、我々は、以下のケースクラスと型の別名があるとします。
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))
だから、はっきりコンパイラは、それがList
上toArray
メソッドへの暗黙の引数として必要とマニフェストを見つけることができます。私たちは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
が必要なためです。実際にはClassManifest
がManifest
のような型引数を表すためにを使用するため、Manifest
のその他のものだけであるので、問題なくF
のClassManifest
を得ることができます。 <?>
がNoManifest
の文字列表現であることを
scala> classManifest[F]
res2: ClassManifest[F] = Foo[<?>]
。ここではNone
の役割を果たしています。F
の型引数について何も言わずに、コンパイラがタイプF
(これは幸いなことに配列の作成に必要なすべてです)に関するクラス情報を表すことができます。それをモデル化する。