के साथ समझ के लिए स्कैला अपवाद मैं समझने की कोशिश कर रहा हूं कि नल के साथ व्यवहार करते समय अजीब व्यवहार की तरह क्या लगता है और समझ के भीतर एनोटेशन टाइप करें।टाइप एनोटेशन
एक उदाहरण के रूप:
मेंdef f(): String = null
for {
a <- Option("hello")
b = f()
} yield (a, b)
परिणाम की उम्मीद:
//> res0: Option[(String, String)] = Some((hello,null))
लेकिन, अगर मैं तो मैं b
def f(): String = null
for {
a <- Option("hello")
b: String = f()
} yield (a, b)
के प्रकार के लिए एक प्रकार का टिप्पणी जोड़ने रनटाइम अपवाद:
//> scala.MatchError: (hello,null) (of class scala.Tuple2)
ऐसा क्यों होता है? वैसे भी पहले उदाहरण में टाइप b
नहीं है? दूसरे उदाहरण में स्पष्ट प्रकार एनोटेशन क्या बदलता है?
(ध्यान दें, उदाहरण स्काला 2.11.4 में चला गया)
के रूप में आप 'reify' repl में उपयोग करते हुए देख सकते हैं दूसरा उदाहरण, एक मैच के लिए संकलित:' आयात scala.reflect.runtime.universe ._; {{{}}} के लिए {पुनः प्राप्त करें। मैं आपको क्यों नहीं बता सकता। एआईयूआई 'नल' मेल नहीं खाता है क्योंकि रनटाइम प्रकार (या मूल्य) पर मेल खाने वाले काम, भले ही 'बी' में 'स्ट्रिंग' का संकलन-समय प्रकार हो; यह कुछ अर्थ में टाइप सिस्टम में एक छेद है, और स्कैला कोड आम तौर पर नल का उपयोग करने से बचना चाहिए। – lmm
मैं नल का कोई प्रशंसक नहीं हूं, मेरा विश्वास करो! वास्तविक कोड में जहां मैंने इस पर ठोकर खाई थी, मैं 'कुछ विरासत जावा कोड के साथ एकीकृत करने के लिए प्रयास करें' का उपयोग कर रहा था। हालांकि, शून्य मेरे लिए आकस्मिक प्रतीत होता है: पहलू मुझे विचित्र लगता है (डरावना?) यह है कि अधिक प्रकार के विशिष्टता परिणामों को एक (अनजान) रनटाइम अपवाद में जोड़ना। –
यह भाषा की अजीबता है जो एक पैटर्न के लिए ''' '' 'उपज' परिणामों में प्रकार डालती है; यह कोई समस्या नहीं है जो अभिव्यक्तियों पर "सामान्य" प्रकारों के साथ घटित होगी। मैं बस इतना कह सकता हूं कि यह दुर्भाग्यपूर्ण है, लेकिन शायद इस चरण में बदला नहीं जा सकता है; मैं इस कारण से उपज/उपज के बाईं ओर एक प्रकार देने से बचता हूं:/ – lmm