varsayalım aşağıdaki vaka sınıf ve tip takma adına sahip:
scala> case class Foo[A](a: A)
defined class Foo
scala> type F = Foo[_]
defined type alias F
Biz artık (değil çok yararlı) tip F
ait şeylerin bir listesini yapın:
scala> val foos: List[F] = List(Foo(1), Foo("a"), Foo('a))
foos: List[F] = List(Foo(1), Foo(a), Foo('a))
Ve bir diziye bu açabilirsiniz:
scala> foos.toArray
res0: Array[F] = Array(Foo(1), Foo(a), Foo('a))
Yani açıkça derleyici o List
üzerinde toArray
yöntemine örtük bir argüman olarak ihtiyacı tezahür bulmak mümkün değildir.
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]
Yani derleyici bizim tipi takma içinde joker temsil etmek manifestoyu kullanma konusunda sorun yaşıyor açıktır: Biz F
için düz eski Manifest
için sorarsanız, bir hatayla olsun.
toArray
nedeninin çalışması, yalnızca Manifest
değil, ClassManifest
olmasını beklemesidir. Ve aslında için hiçbir sorunla karşılaşmadık, tam olarak, tür argümanlarını göstermek için OptManifest
kullandığı için Manifest
türünün aksine, tip argümanları yalnızca Manifest
türünde başka bir şeydir.
scala> classManifest[F]
res2: ClassManifest[F] = Foo[<?>]
<?>
NoManifest
dize temsilidir O. Burada None
rolünü oynar, burada derleyici F
türüyle ilgili sınıf bilgilerini temsil eder (bu, bir dizi oluşturmak için gereken tek şeydir), F
türünün argümanları hakkında hiçbir şey söylemeden "hayır, yapabilirim" t model ".