2011-03-15 13 views
7

मुझे आश्चर्य है कि क्या (implicit ev: Null <:< A1) यहाँ कारण है:विकल्प की या नल विधि में यह अनिवार्य अंतर्निहित तर्क क्यों है?

sealed abstract class Option[+A] extends Product with Serializable { 
    def orNull[A1 >: A](implicit ev: Null <:< A1): A1 = this getOrElse null 
    ... 
} 

def orNull[A]: A = this getOrElse null 

पर्याप्त यह देखते हुए कि यह और भी

Option(1).orNull 
की तरह मूल्य प्रकार के साथ काम करने के लिए प्रतीत नहीं होता नहीं होगा

लेकिन

Option(1).getOrElse(null) 

करता है?

Option के source code

+2

'विकल्प (1) .getOrElse (शून्य)' "काम करता है", लेकिन समग्र प्रकार कोई है, जो एक बहुत उपयोगी प्रकार नहीं है। –

उत्तर

10

नहीं सभी स्केला प्रकार अशक्त हो सकता है। विशेष रूप से, किसी के दो बच्चे हैं, AnyRef और AnyVal। AnyRef शून्य प्रकारों को संभाल सकता है। AnyVal प्रकार JVM पर primitives हो सकता है और इसलिए शून्य नहीं हो सकता है। निहित एक देरी प्रकार की जांच है जो विकल्प [स्ट्रिंग] का उपयोग करने के लिए या नल की अनुमति देता है लेकिन विकल्प नहीं [Int]।

नोट: इंटेल बॉक्सिंग/अनबॉक्स किए गए ऑब्जेक्ट/आदिम के इस डिकोटॉमी में स्केल में बहुत अजीब अभिव्यक्तियां हैं, जैसे null.asInstanceOf [int] == ​​0 // true।

+1

यहां तक ​​कि यह काम करता है: 'null.asInstanceOf [कुछ नहीं] // एनपीई' – soc

5
scala> abstract class Op[A] { 
    | def getOrElse(b: A): A 
    | def orNull[A]: A = this getOrElse null 
    | } 
<console>:14: error: type mismatch; 
found : Null(null) 
required: A 
     def orNull[A]: A = this getOrElse null 
             ^

तो, null नहीं सभी A के लिए एक स्वीकार्य प्रकार, केवल नल लोगों के लिए है। AnyVal के उप-वर्ग गैर-शून्य प्रकारों के विशिष्ट उदाहरण हैं। उस पैरामीटर की अनुपस्थिति में, इस विधि को लिखना संभव नहीं है।