जावा java.lang.Class <T> ऑब्जेक्ट के बराबर स्केल


183

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

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

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

स्काला में, मेरा भोला प्रयास है:

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

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


VonC ने पहले ही उत्तर प्रदान कर दिया है, लेकिन Scala & Erasure पर मेरे स्वयं के प्रश्न / उत्तर पर एक नज़र डालें । मुझे लगता है कि यह आपको विचारों के साथ एक अलग तरीके से चीजें प्रदान करने की कोशिश कर सकता है जो आप कोशिश कर रहे हैं।
डैनियल सी। सोबरल जूल

जवाबों:


264

" द स्काला टाइप सिस्टम " के अनुसार,

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.