2012-07-30 13 views
21

मैं एक इंट को यह डाली है कैसे और नहीं Some(Int)कास्ट विकल्प [कोई]

val a: Option[Any] = Some(1) 

मैं toInt की कोशिश की और यह .asInstanceOf पद्धति का उपयोग करना एक त्रुटि value toInt is not a member of Option[Any]

उत्तर

34

आप a.get.asInstanceOf[Int] कर सकते हैं हालांकि यह असुरक्षित है। Option[Any] के बजाय Option[Int] का उपयोग करके टाइप जानकारी को बनाए रखने का एक बेहतर तरीका होगा। तो आपको asInstanceOf के साथ परिणाम डालने की आवश्यकता नहीं होगी।

val a:Option[Int] = Some(1) 
val i = a.get 

get का उपयोग करते हुए सीधे असुरक्षित के बाद से यदि Option एक None है एक अपवाद फेंका जाता है। तो getOrElse का उपयोग करना सुरक्षित है। या आप मूल्य प्राप्त करने के लिए a पर पैटर्न मिलान का उपयोग कर सकते हैं।

val a:Option[Any] = Some(1) // Note using Any here 
val i = (a match { 
    case Some(x:Int) => x // this extracts the value in a as an Int 
    case _ => Int.MinValue 
}) 
+1

कास्टिंग के बारे में थोड़ा भूल जाओ; पैटर्न मेलिंग स्पष्ट रूप से –

+0

जाने का तरीका है I सहमत हैं। पैटर्न मिलान बहुत शक्तिशाली और भयानक है :) –

12

दिया int करने के लिए

a.getOrElse(0).asInstanceOf[Int] 

मुझे यह ध्यान रखना होगा कि यह असुरक्षित कास्ट है: यदि आपके विकल्प में Int नहीं है, तो आपको दौड़ मिल जाएगी आईम अपवाद।

3

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

विशेष रूप से, यदि आप प्रत्येक प्रोग्रामिंग भाषा का सर्वोत्तम लाभ उठाना चाहते हैं, तो उचित उपयोगकर्ता बनाने का प्रयास करें, और यदि कोई भाषा उपयोग में फिट नहीं है तो आप केवल एक और चुन सकते हैं (जैसे गतिशील रूप से टाइप किया गया) :

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

+3

या आप जावा पुस्तकालयों का उपयोग कर रहे हैं (बुरी तरह से डिजाइन किए गए) ... – ziggystar

+2

जबकि मैं भावनाओं की सराहना करता हूं, वास्तविक जीवन परियोजनाओं में, चीजें हमेशा काले और सफेद नहीं होती हैं। ऐसा करने के लिए मेरे लिए एक वैध आवश्यकता है क्योंकि यह अंतर्निहित तृतीय पक्ष एपीआई द्वारा लौटाए गए 4 प्रकारों में से एक हो सकता है। – Bob

+0

यह एक बहुत कमजोर तंत्र है। आप शायद बेहतर पैटर्न के साथ ऐसा ही कर सकते हैं ... आप यह समझाने की कोशिश क्यों नहीं करते कि आप क्या करना चाहते हैं? – Edmondo1984

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