मान लीजिए हम निम्नलिखित मामले वर्ग और प्रकार उर्फ है:
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
विधि के लिए एक अंतर्निहित तर्क के रूप में की जरूरत है खोजने के लिए सक्षम है।
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]
तो यह स्पष्ट है कि संकलक प्रकट होता है का उपयोग कर हमारे प्रकार उर्फ में वाइल्डकार्ड का प्रतिनिधित्व करने में परेशानी हो रही है: लेकिन अगर हम एक सादे पुराने Manifest
F
के लिए के लिए पूछना है, हम कोई त्रुटि मिलती है।
कारण toArray
काम करता है कि यह की अपेक्षा करता है, न केवल Manifest
। और वास्तव में हम F
के लिए कोई समस्या नहीं है, ठीक है क्योंकि ClassManifest
OptManifest
का उपयोग अपने प्रकार के तर्कों का प्रतिनिधित्व करने के लिए करता है-Manifest
के विपरीत, जिसका प्रकार तर्क Manifest
प्रकार की अन्य चीजें हैं।
scala> classManifest[F]
res2: ClassManifest[F] = Foo[<?>]
<?>
NoManifest
की स्ट्रिंग प्रतिनिधित्व है यही कारण है कि। यह None
की भूमिका निभाता है, जिससे संकलक F
(जो कि हमें सरणी बनाने के लिए जरूरी है) के बारे में वर्ग की जानकारी का प्रतिनिधित्व करने की इजाजत देता है, F
के प्रकार के तर्कों के बारे में कुछ भी बगैर "नो, मैं कर सकता हूं" टी मॉडल कि "।