2012-07-05 12 views
6

संभव डुप्लिकेट:
If an Int can't be null, what does null.asInstanceOf[Int] mean?स्काला में इंट और डबल करने के लिए अशक्त कास्टिंग

मैं आरईपीएल में निम्नलिखित की कोशिश की:

scala> null.asInstanceOf[Int] 
res12: Int = 0 

scala> null.asInstanceOf[Float] 
res13: Float = 0.0 

scala> null.asInstanceOf[Double] 
res14: Double = 0.0 

यह एक क्रम अपवाद उम्मीद होती है (NPE या ClassCastException) उस मामले में।
कोई भी क्यों समझा सकता है स्कैला null शून्य पर रहता है?

उत्तर

5

यह वास्तव में अजीब बात है के रूप में यह व्यवहार विवरणों के आधार पर की उम्मीद नहीं है:

asInstanceOf[T] रिटर्न null वस्तु ही अगर T scala.AnyRef के अनुरूप है, और नहीं तो एक NullPointerException फेंकता है।

- The Scala Language Specification, Version 2.9, पी। 75.

और यह एक known bug कि बंद कर दिया है लेकिन this one से संबंधित है, जो खुला है।

1

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

+0

मैं अपने आप को द्वारा 'असली' कोड में यह कोशिश नहीं की है, लेकिन इस व्यवहार अपने साथी "असली" कोड में देखा है। – Michael

3

कारण यह है कि null एक संदर्भ प्रकार है - कास्टिंग हमेशा किसी अन्य संदर्भ प्रकार में परिवर्तित होता है - इस मामले में Int या Double का बॉक्स संस्करण।

अगले चरण में, कंपाइलर बॉक्स किए गए ऑब्जेक्ट को एक आदिम मान में परिवर्तित करता है। यदि Int ऑब्जेक्ट null है, तो इसके संबंधित डिफ़ॉल्ट आदिम मान 0 है।

देखें: If an Int can't be null, what does null.asInstanceOf[Int] mean?

+0

धन्यवाद। क्या यह भाषा विनिर्देश का पालन करता है? – Michael

+0

डिफ़ॉल्ट मानों के बीच कनवर्ट करने वाले भाग के बारे में निश्चित नहीं है। – axel22

+0

हां, ऐसा लगता है कि इस भाग विनिर्देश के विपरीत है (निकोलस का जवाब देखें) – Michael

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