2011-05-24 16 views
10

मैं सिर्फ स्काला के साथ शुरू कर दिया और कोई समस्या हुई थी:दोहराएं

स्काला प्रकार Tuple1, Tuple2, ..., Tuple22 है। प्रश्नों पर पुनरावृत्ति करते समय Scalaquery tuples देता है।

अब मेरे पास एक दिया गया वर्ग (जेडके ListitemRenderer) है, जो Object एस स्वीकार करता है और पंक्तियों के साथ गुई सूचियों को पॉप्युलेट करता है, जिनमें से प्रत्येक में कुछ कोशिकाएं होती हैं। लेकिन ListitemRenderer सामान्य नहीं है। तो मेरी समस्या यह है कि मेरे पास Object "डेटा" है, जो वास्तव में मनमानी लंबाई का एक गुच्छा है, जिसे मुझे कोशिकाओं को बनाने के लिए फिर से शुरू करना है (बस data._1.toString, ... के साथ)।

के बाद से वहाँ, कोईमैं Tuple1-22 को महाप्रकार नहीं पता था है मैं नहीं कर सकते न सिर्फ data.asInstanceOf[Tuple].productIterator foreach {…}

मैं क्या कर सकते हैं कर सकता है?


उत्तर नीचे मुझसे कहा था वास्तव में सभी tuples के लिए एक विशेषता है कि वहाँ - Product - वांछित foreach समारोह प्रदान करते हैं।

उत्तर

17

सभी TupleX कक्षाएं Product से प्राप्त होती हैं, जो def productIterator : Iterator[Any] को परिभाषित करती है। आप इसे किसी भी tuple के सभी तत्वों के माध्यम से पुनरावृत्त करने के लिए बुला सकते हैं।

उदाहरण के लिए:

def toStringSeq(tuple: Product) = tuple.productIterator.map(_.toString).toIndexedSeq 
तो
+0

मुझे क्या 'data.asInstanceOf [उत्पाद] .productIterator foreach {...}'? –

+0

@ फ्लाईंग भेड़: यह चाल चलाना चाहिए, लेकिन आप 'किसी भी' या 'AnyRef'' के बजाय अपने उत्पाद के 'डेटा' तर्क को 'उत्पाद'' के रूप में टाइप कर सकते हैं (मुझे लगता है कि आपका मतलब है कि जब आप 'ऑब्जेक्ट' कहते हैं) । वह आपको कास्ट बचाएगा। – kassens

+0

जैसा कि सवाल में कहा गया है: फ़ंक्शन मैं एक गैर-जेनेरिक इंटरफ़ेस से एक फ़ंक्शन लागू करता हूं, इसलिए मैं टाइपिंग को बदल नहीं सकता और उसे कास्ट करना पड़ता हूं, सिवाय इसके कि स्केल के पास जेनेरिक होने के लिए इंटरफ़ेस को बंदरगाह करने का कोई तरीका है। –

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