को समझने के लिए क्यों यह उपयोगी है, IttayD provided a nice explanation:
तो क्या हम इसे पसंद किया है | डीईएफ़ orNull[A >: Null] = .....
है, लेकिन एक है पहले से सेट है और हम विशेषता की परिभाषा में प्रतिबंधित नहीं करना चाहते हैं। इसलिए, या नल सबूत की अपेक्षा करता है कि ए एक शून्य प्रकार है। यह सबूत एक अंतर्निहित चर (इसलिए नाम 'EV')
सारांश में के रूप में है, टाइप की कमी उपयोगी है जब आप तरीकों (जैसे orNull
) एक सामान्य वर्ग पर (जैसे Option
चाहते हैं) कक्षा के मुकाबले अधिक विशिष्ट बाधाओं (जैसे Null <: A <: Any
) के साथ (उदाहरण के लिए A <: Any
)।
यह एक और "फीचर" है जो भाषा में नहीं बनाया गया है, लेकिन निहित पैरामीटर और टाइप पैरामीटर के भिन्नता एनोटेशन के लिए मुफ्त धन्यवाद के लिए आता है। यह समझने के लिए, <:<
की परिभाषा को देखो:
// from Predef
sealed abstract class <:<[-From, +To] extends (From => To)
implicit def conforms[A]: A <:< A = new (A <:< A) {def apply(x: A) = x}
लिए
scala> Some(1).orNull
<console>:10: error: could not find implicit value for parameter ev: <:<[Null,Int]
Some(1).orNull
संकलक प्रकार <:<[Null, Int]
का एक अंतर्निहित मूल्य के लिए लग रहा है और विधि def conforms[A]: A <:< A
मिल जाएगा। तो A
होना चाहिए जिसके लिए <:<[A, A]
<:<[Null, Int]
के अनुरूप है। इसमें कोई A
नहीं है जिसके लिए यह धारण करता है और नतीजतन संकलक लापता निहित मूल्य के बारे में शिकायत करेगा।
हालांकि, के लिए
scala> Some("hi").orNull
res21: java.lang.String = hi
हम भाग्यशाली रहे हैं। अब, संकलक A
खोजने की कोशिश करता है जिसके लिए <:<[A, A]
<:<[Null, String]
के अनुरूप है। यह A = String
के लिए काम करता है, क्योंकि Null
String
का उप प्रकार है और From
वर्ग <:<
के प्रकार पैरामीटर को contravariant के रूप में परिभाषित किया गया है)।
जैसा कि बताया गया है, प्रकार की बाधाओं के बारे में सोचने का सबसे सहज तरीका इसे एक प्रकार की तरह पढ़ रहा है (यानी इसे नल <: Int) के रूप में पढ़ना। Null
Int
के अनुरूप नहीं है और <: < [Null, Int] के लिए कोई अंतर्निहित मूल्य नहीं है। दूसरी ओर, Null
String
के अनुरूप है और संकलक को अंतर्निहित पैरामीटर मिलेगा।
वैसे, यहां एक और related answer है।
ओह, स्रोत कोड का उपयोग करता है 'अशक्त <: