2011-06-16 18 views
7

मैं एक एपीआई (तृतीय पक्ष जावा पुस्तकालय से) है जैसा दिखता है:स्कैला सूची में प्रत्येक तत्व को कैसे डाला जाए?

public List<?> getByXPath(String xpathExpr) 

एक वर्ग कहा जाता DomNode

मैं कुछ करना चाहता हूँ पर परिभाषित है, जिसमें प्रत्येक आइटम की है स्काला सूची प्राप्त करना चाहते निर्दिष्ट प्रकार:

val txtNodes: List[DomText] = node.getByXPath(xpath).toList 

लेकिन कंपाइलर त्रुटि देता है: टाइप मिस्चैच।

इस समस्या का समाधान क्या है?

+0

यह आवश्यक 'आयात scala.collection.JavaConversions._' संकलित करने के लिए। – Lutz

उत्तर

13

आपको सूची के प्रत्येक तत्व को कास्ट करने की आवश्यकता है, यह साबित करने के लिए कि उनमें से सभी आवश्यक प्रकार हैं। आपको लगता है कि बस क्या कर सकते हैं जब पुनरावृत्ति, उदाहरण के लिए

node.getByXPath(xpath).map{case d: DomText => d}.toList 

या

node.getByXPath(xpath).map(_.asInstanceOf[DomText]).toList 

जो भी डाली आप बेहतर सूट के लेखन।

आप सूची, node.getByXPath(xPath).toList.asInstanceOf[List[DomText]] भी डाल सकते हैं, लेकिन आपको एक चेतावनी मिलेगी, क्योंकि इस कास्ट टाइप एरर (जैसे जावा में) के कारण किसी भी जांच के बिना किया जाता है।

+0

मेरा मानना ​​है कि उपरोक्त आपके दो उदाहरण सूचियों के लिए अलग-अलग व्यवहार देंगे जिनके पास डोमटेक्स्ट के अलावा अन्य तत्व हैं, पहले उदाहरण चुपचाप उन्हें छोड़कर और दूसरा उदाहरण रनटाइम अपवाद फेंकना। यदि ऐसा है, तो उनके बीच की पसंद व्यक्तिगत वरीयता से अधिक शामिल होगी। –

+0

वे नहीं करते हैं। नक्शा एक फंक्शन तर्क लेता है, पार्टिकल फ़ंक्शन नहीं, और फ़ंक्शन विफल होने पर यह असफल हो जाएगा। @Alois Cochard उत्तर में प्रस्तुत के रूप में एकत्रित करें फ़िल्टर होगा। हालांकि, मेरे दो प्रकार अलग-अलग अपवाद में फेंकते हैं, पैटर्न मिलान के साथ MatchError, ClassCastException asInstanceOf के साथ। –

9

स्काला 2.8 के बाद से, आप उपयोग कर सकते हैं 'कलेक्ट':

scala> "hi" :: 1 :: "world" :: 4 :: Nil collect {case s:String => s} 
res13: List[String] = List(hi, world) 

स्रोत: http://daily-scala.blogspot.com/2010/04/filter-with-flatmap-or-collect.html

+1

अच्छा और मैं इसे भूलना जारी रखता हूं। हालांकि एक अंतर है। जैसा कि आपके उदाहरण द्वारा प्रदर्शित किया गया है, संग्रह उन तत्वों को फ़िल्टर करेगा जिन्हें जाया नहीं जा सकता है। दूसरी तरफ, यदि कोई तत्व है तो नक्शा असफल हो जाएगा। वर्तमान स्थिति में जहां सभी कलाकार ठीक हैं, इससे कोई फर्क नहीं पड़ता। जब कोई सुनिश्चित नहीं होता है कि कास्ट ठीक रहेगा, तो किसी को यह तय करना होगा कि असफलता का फ़िल्टर करना चाहता है या नहीं। –

+0

@didierd आप पूरी तरह से सही हैं, और ब्लॉग पोस्ट की टिप्पणियों में एक अच्छा उदाहरण है जिसमें मैंने दिखाया है कि एक बेवकूफ तरीके से कास्ट अपवाद को कैसे संभालना है! –

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