"The Scala Type System" के अनुसार,
val c = new C
val clazz = c.getClass // method from java.lang.Object
val clazz2 = classOf[C] // Scala method: classOf[C] ~ C.class
val methods = clazz.getMethods // method from java.lang.Class<T>
classOf[T]
विधि एक स्काला प्रकार के लिए क्रम प्रतिनिधित्व देता है। यह जावा अभिव्यक्ति T.class
के समान है।
classOf[T]
का उपयोग सुविधाजनक है जब आपके पास एक प्रकार है जिसके बारे में आप जानकारी चाहते हैं, जबकि getClass
इस प्रकार के उदाहरण से एक ही जानकारी को पुनर्प्राप्त करने के लिए सुविधाजनक है।
हालांकि, classOf[T]
और getClass
वापसी थोड़ा अलग मूल्यों, JVM पर प्रकार विलोपन के प्रभाव, getClass के मामले में को दर्शाती है।
scala> classOf[C]
res0: java.lang.Class[C] = class C
scala> c.getClass
res1: java.lang.Class[_] = class C
है यही कारण है कि following will not work:
val xClass: Class[X] = new X().getClass //it returns Class[_], nor Class[X]
val integerClass: Class[Integer] = new Integer(5).getClass //similar error
एक ticket regarding the return type of getClass
नहीं है।
(James Moore की रिपोर्ट है कि टिकट "अब" नवम्बर 2011, दो साल बाद है, यानी, तय
2.9.1 में, getClass
अब करता है:।
scala> "foo".getClass
res0: java.lang.Class[_ <: java.lang.String] = class java.lang.String
)
वापस 2009 में:
यह अगर स्काला getClass() एक java.lang.Class [टी] forSome {वैल टी: सी} के रूप में से लौटने के इलाज के लिए थे उपयोगी होगा जहां सी चीज़ है जी अभिव्यक्ति के स्थैतिक प्रकार के क्षरण की तरह है जिस पर getClass को
यह मुझे निम्न जैसा कुछ करने देता है जहां मैं कक्षा पर आत्मनिरीक्षण करना चाहता हूं लेकिन कक्षा के उदाहरण की आवश्यकता नहीं है।
मैं उन वर्गों के प्रकारों को भी सीमित करना चाहता हूं जिन पर मैं आत्मनिरीक्षण करना चाहता हूं, इसलिए मैं कक्षा [_ <: Foo] का उपयोग करता हूं। लेकिन यह मुझे फू क्लास में गुजरने के बिना Foo.getClass() का उपयोग करके गुजरने से रोकता है।
नोट: getClass
के बारे में, एक संभावित समाधान होगा:
class NiceObject[T <: AnyRef](x : T) {
def niceClass : Class[_ <: T] = x.getClass.asInstanceOf[Class[T]]
}
implicit def toNiceObject[T <: AnyRef](x : T) = new NiceObject(x)
scala> "Hello world".niceClass
res11: java.lang.Class[_ <: java.lang.String] = class java.lang.String
VonC पहले से ही उत्तर प्रदान किया है, लेकिन मेरे अपने [प्रश्न/उत्तर] पर एक नज़र डालें (http://stackoverflow.com/ स्केल और मिटा पर प्रश्न/1094173/कैसे-करें-i-get-around-type-erasure-on-scala-or-why-cant-i-get-the-type-पैरामीटर)। मुझे लगता है कि यह आपको चीजों को एक अलग तरीके से करने के लिए विचारों के साथ प्रदान कर सकता है जो आप कोशिश कर रहे हैं। –