2012-06-23 99 views
14

स्काला में,क्यों प्राचीन प्रकार के हैं जैसे कि Intala में ऑब्जेक्ट को मिटा दिया गया है?

{ x: Option[Int] => x } 
    .getClass 
    .getMethod("apply", classOf[Option[_]]) 
    .getGenericParameterTypes 

रिटर्न Array(scala.Option<java.lang.Object>)। मैं शुरुआत में Array(scala.Option<scala.Int>) को देखने की उम्मीद कर रहा था, लेकिन मुझे लगता है कि scala.Int एक मूल्य वर्ग (AnyVal बढ़ाता है) 'जिसका उदाहरण अंतर्निहित मेजबान सिस्टम द्वारा ऑब्जेक्ट्स के रूप में नहीं दर्शाया जाता है।'

मुझे अभी भी Object के क्षरण को समझ में नहीं आता है। क्या यह अधिक उपयोगी java.lang.Integer नहीं हो सकता है?

+1

वह स्कैला ऐसा नहीं कर रहा है - यह जावा है। गैर-ऑब्जेक्ट में उपयोगी होने के लिए, "जेनेरिक पैरामीटर टाइप्स" (जावा क्लास ऑब्जेक्ट की एक विधि) के परिणाम, एक सबक्लास को बनाना होगा। स्काला * 'विकल्प [Int]' के लिए 'OptionInt' कहें, सबक्लास बनाएं नहीं। (देखें @ विशेषीकृत, शायद?) –

+2

@pst; मुझे लगता है कि आप गलत रास्ते पर हैं। उपरोक्त 'प्रतीक' को 'प्रतीक' में बदलें और आपको 'ऐरे (स्कैला.ऑप्शन <स्कैला। सिंबल>)' प्राप्त करें। –

+0

हम्म, अच्छी तरह से मेरी परिकल्पना है: -/मैं कंपाइलर जादू दोष। –

उत्तर

6

यह अधिक उपयोगी java.lang.Integer नहीं हो सकता है?

हां, और यह भी एक बार मामला था। दुर्भाग्य से, यह टूटा प्रकार हस्ताक्षर की ओर जाता है। Intjava.lang.Integer पर मिटा दिया गया है, तो सभी स्थितियों में सही बाइटकोड उत्पन्न करना असंभव है।

कोई टिकट नहीं है या इसके बारे में प्रतिबद्ध नहीं है, लेकिन जिसने इस विशेष व्यवहार को बदल दिया है SI-4214, this commit में।

+0

धन्यवाद। मैंने 'git log --grep = Integer' पर एक नज़र डाली थी लेकिन कुछ भी स्पष्ट नहीं देखा। –

+0

@ स्कॉट मॉरिसन आपको "हस्ताक्षर" की खोज करनी चाहिए थी। वैसे भी, मैंने इसे आपके लिए पाया। संशोधित उत्तर देखें। –