2009-07-16 18 views
156

सवाल सबसे अच्छा एक उदाहरण द्वारा समझाया गया है:स्काला बराबर

:

एक जेपीए EntityManager के लिए जावा में, मैं निम्न कर सकते हैं (खाता मेरी इकाई वर्ग है)

Account result = manager.find(Account.class, primaryKey); 

स्काला में, मेरा अनुभवहीन प्रयास है:

val result = manager.find(Account.class, primaryKey) 

लेकिन जब मैं स्काला में Account.class इस्तेमाल करने की कोशिश, यह इस तरह नहीं लगता है। मैं स्कैला में खाता वर्ग के लिए java.lang.Class ऑब्जेक्ट को कैसे निर्दिष्ट कर सकता हूं?

+0

VonC पहले से ही उत्तर प्रदान किया है, लेकिन मेरे अपने [प्रश्न/उत्तर] पर एक नज़र डालें (http://stackoverflow.com/ स्केल और मिटा पर प्रश्न/1094173/कैसे-करें-i-get-around-type-erasure-on-scala-or-why-cant-i-get-the-type-पैरामीटर)। मुझे लगता है कि यह आपको चीजों को एक अलग तरीके से करने के लिए विचारों के साथ प्रदान कर सकता है जो आप कोशिश कर रहे हैं। –

उत्तर

227

"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 
+4

एफवाईआई, टिकट @ वीओएनसी का उल्लेख 22/जून/11 को तय किया गया था। 2.9.1 में, getClass अब करता है: scala> "foo" .getClass res0: java.lang.Class [_ <: java.lang.String] = class java.lang.String –

41

classOf[Account] स्कैला में जावा में Account.class के बराबर है।