" द स्काला टाइप सिस्टम " के अनुसार,
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
इसीलिए निम्नलिखित काम नहीं करेगा :
val xClass: Class[X] = new X().getClass //it returns Class[_], nor Class[X]
val integerClass: Class[Integer] = new Integer(5).getClass //similar error
वापसी के प्रकार के बारे मेंgetClass
एक टिकट है ।
( जेम्स मूर की रिपोर्ट है कि टिकट "अब" है, यानी नवंबर 2011, दो साल बाद, निश्चित।
2.9.1 में, getClass
अब करता है:
scala> "foo".getClass
res0: java.lang.Class[_ <: java.lang.String] = class java.lang.String
)
2009 में वापस:
यह उपयोगी होगा यदि स्काला को गेटक्लास () से java.lang.Class [T] forSome {val T: C} के रूप में वापसी का इलाज करना है, जहां C कुछ इस तरह का होता है जैसे स्टैटिक प्रकार का एक्सप्रेशन जिस पर गेटक्लास होता है बुलाया
यह मुझे निम्नलिखित की तरह कुछ करने देगा जहां मैं एक वर्ग पर आत्मनिरीक्षण करना चाहता हूं, लेकिन एक वर्ग उदाहरण की आवश्यकता नहीं होनी चाहिए।
मैं उन कक्षाओं के प्रकारों को भी सीमित करना चाहता हूं जिन पर मैं आत्मनिरीक्षण करना चाहता हूं, इसलिए मैं कक्षा [_ <: 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