प्रकार के पैरामीटर के लिए Scala classOf


80

मैं स्कैला / जावा का उपयोग करके ऑब्जेक्ट अपडेट के लिए एक सामान्य विधि बनाने की कोशिश कर रहा हूं, लेकिन मैं एक प्रकार के पैरामीटर के लिए कक्षा नहीं प्राप्त कर सकता हूं।

यहाँ मेरा कोड है:

object WorkUnitController extends Controller {     
 def updateObject[T](toUpdate: T, body: JsonObject){
  val source = gson.fromJson(body, classOf[T]);
  ...
 }
}

मुझे जो त्रुटि है वह है

वर्ग प्रकार की आवश्यकता है लेकिन टी मिला

मुझे पता है कि जावा में आप ऐसा नहीं कर सकते हैं, लेकिन क्या यह सब संभव है?

धन्यवाद!


इन्हें भी देखें: मुद्दों .scala
सामाजिक

जवाबों:


93

कारण प्रकट कर रहा है पदावनत (स्काला 2.10.0 के बाद से) इस अद्यतन जवाब है -

import scala.reflect.ClassTag
import scala.reflect._

object WorkUnitController extends Controller {
  def updateObject[T: ClassTag](toUpdate: T, body: JsonObject){
    val source = gson.fromJson(body, classTag[T].runtimeClass)
    ???
  }
}

आप के ClassTagबजाय ClassManifest और के .runtimeClassबजाय का उपयोग करना चाहिए.erasure

मूल उत्तर - हां, आप ऐसा कर सकते हैं कि मैनिफ़ेस्ट का उपयोग कर:

object WorkUnitController extends Controller {     
 def updateObject[T: ClassManifest](toUpdate: T, body: JsonObject){
  val source = gson.fromJson(body, classManifest[T].erasure);
  ...
 }
}

हे भगवान यह अद्भुत है! काश मैं इस बारे में पहले से जानता!
डार्कजेलस

1
तुम भी लिख सकते हैं manifest[T]के बजाय implicitly[Manifest[T]]
जीन-फिलिप पेलेट

1
@ mericano1 वे भाषा का एक अनिवार्य हिस्सा बन गए हैं, और मुझे लगता है, मैनिफ़ेस्ट अब एक प्रायोगिक विशेषता नहीं हैं
वासिल रेमेनिएक

12
@ mericano1 एक अपडेट: Manifestऔर ClassManifestअब स्केल किया गया है, स्कैला 2.10 पर क्रमशः TypeTagऔर ClassTag, के साथ प्रतिस्थापित किया गया है ।
डैनियल सी। सोबरल

9
इसके बजाय classTag[T].runtimeClassमुझे जरूरत थी classTag[T].runtimeClass.asInstanceOf[Class[T]]। क्या किसी को पता है क्यों?
kosii

6

वासिल और मैक्सिम के जवाब से मुझे मदद मिली।

व्यक्तिगत रूप से, मैं उस वाक्य-विन्यास को पसंद करता हूँ जहाँ implicitइस तरह के मापदंडों को जोड़ने के लिए उपयोग किया जाता है (प्रस्तुत इसके : ClassTagलिए आशुलिपि है। तो यहाँ, यदि कोई अन्य व्यक्ति भी इसे बेहतर तरीके से देखता है:

import scala.reflect.ClassTag

object WorkUnitController extends Controller {
  def updateObject[T](toUpdate: T, body: JsonObject)(implicit tag: ClassTag[T]){
    val source = gson.fromJson(body, tag.runtimeClass)
    ???
  }
}

अस्वीकरण: मैंने उपरोक्त संकलन नहीं किया है, लेकिन मेरा अपना समान कोड इस तरह से काम करता है।

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