2013-06-04 27 views
47

के लिए कोई क्लासटाग उपलब्ध नहीं है मैं स्कैला के लिए अपेक्षाकृत नया हूं और एक सामान्य ऑब्जेक्ट विधि को परिभाषित करने की कोशिश कर रहा हूं। हालांकि, जब मैं विधि के भीतर पैरामीटरयुक्त प्रकार का संदर्भ देता हूं तो मुझे "टी के लिए कोई क्लासटाग उपलब्ध नहीं है"। यहां एक विकसित उदाहरण है जो समस्या को दर्शाता है।स्कैला जेनेरिक विधि - टी

scala> def foo[T](count: Int, value: T): Array[T] = Array.fill[T](count)(value) 
<console>:7: error: No ClassTag available for T 
     def foo[T](count: Int, value: T): Array[T] = Array.fill[T](count)(value) 
                     ^

यह समझने में सहायता के लिए अग्रिम धन्यवाद कि यह क्या गलत है और इस आकस्मिक उदाहरण के काम को कैसे बनाया जाए।

उत्तर

59

एक सामान्य संदर्भ में एक सरणी (T की एक सरणी जहां T एक प्रकार पैरामीटर है instantiating) का दृष्टांत के लिए, स्काला प्रकार ClassTag[T] का एक अंतर्निहित मूल्य के रूप में T के बारे में कार्यावधि में जानकारी है, की जरूरत है। Concretely, आप करने के लिए अपने विधि के फोन करने वाले की जरूरत है (परोक्ष) इस ClassTag मूल्य, जो आसानी से एक संदर्भ उपयोग किया जा सकता बाध्य पारित:

def foo[T:ClassTag](count: Int, value: T): Array[T] = Array.fill[T](count)(value) 

इस स्थिति का एक (संपूर्ण) विवरण के लिए, यह देखने दस्तावेज़:

http://docs.scala-lang.org/sips/completed/scala-2-8-arrays.html

(इसे शीघ्र ही कहें, ClassTags तो तर्क रहता है, ClassManifests की reworked कार्यान्वयन कर रहे हैं)

+8

आकर्षक। 'आयात scala.reflect.ClassTag' के साथ यह काम करता है। धन्यवाद। – Chuck

+3

लोगों को यह निर्देशक भी मिल सकता है - http://docs.scala-lang.org/overviews/reflection/typetags-manifests.html - चूंकि क्लासमैनिफेट दूर जा रहे हैं। – Chuck

+0

यदि हम फ़ंक्शन बॉडी में टाइप टी के दो मानों की तुलना करते हैं, तो हमें 'क्लासटाग एनोटेशन' के अतिरिक्त 'अंतर्निहित' orderer पैरामीटर की आवश्यकता होती है। – AlvaPan

संबंधित मुद्दे