2013-02-26 123 views
11

दिए गए क्लासटैग कैसे बनाते हैं, मैं एक फ़ंक्शन को परिभाषित करना चाहता हूं जो एक ऐरे देता है, और मेरे पास टाइपटाग है। क्या मैं आवश्यक क्लासटैग उत्पन्न कर सकता हूं?स्कैला 2.10 में, आप टाइपटाग

scala> import scala.reflect.runtime.universe._ 
import scala.reflect.runtime.universe._ 

scala> def fun[X: TypeTag]: Array[X] = Array.ofDim[X](10) 
<console>:11: error: No ClassTag available for X 
     def fun[X: TypeTag]: Array[X] = Array.ofDim[X](10) 

या यह आवश्यक ClassTag की अंतर्निहित प्रमाण उपलब्ध कराने के लिए है:

scala> import reflect.ClassTag 
import reflect.ClassTag 

scala> def fun[X: ClassTag: TypeTag]: Array[X] = Array.ofDim[X](10)(implicitly[ClassTag[X]]) 
fun: [X](implicit evidence$1: scala.reflect.ClassTag[X], implicit evidence$2: reflect.runtime.universe.TypeTag[X])Array[X] 

मैं इसे सरल एक TypeTag से एक ClassTag उत्पन्न करने के लिए सोचा होगा, लेकिन मैं कोई स्पष्ट रास्ता देखते हैं।

def fun[X:TypeTag]: Array[X] = { 
    val mirror = runtimeMirror(getClass.getClassLoader) 
    implicit val xClassTag = ClassTag[X](mirror.runtimeClass(typeTag[X].tpe)) 
    Array.ofDim[X](10) 
} 

आप सुनिश्चित करने के लिए हालांकि कि तुम सच में पहली जगह में एक TypeTag पास करनी होगी चाहता हूँ:

+0

संभावित डुप्लिकेट [क्लासटाग फॉर्म टाइपटाग कैसे प्राप्त करें, या दोनों एक ही समय में?] (Http://stackoverflow.com/questions/18729321/how-to-get-classtag-form-typetag-or-both- एक ही समय में) – Suma

उत्तर

8

मैं एक सरल समाधान को देखने के लिए अच्छा लगेगा, लेकिन यहाँ मैं क्या लेकर आए हैं । क्या आप ClassTag इसके बजाय (def fun[X: ClassTag] में) पास नहीं कर सकते हैं?

+0

समस्या वास्तव में कॉस्मेटिक है, मुझे फ़ंक्शन के दायरे में टाइपटाग की आवश्यकता है, लेकिन क्लासटाग उस फ़ंक्शन के भीतर एक कॉल साइट पर है, और क्लासटाग को सभी तरह से निहित करने के लिए अतिरिक्त प्रकार का शोर नहीं होगा कॉल श्रृंखला ऊपर। –