java - जावा 6 बनाम जावा 7 के बीच ऑटो-अनबॉक्सिंग में अंतर




casting java-7 (2)

तुम सही हो; इसे और अधिक सरल बनाने के लिए:

Object o = new Integer(1234);
int x = (int) o;

यह जावा 7 में काम करता है, लेकिन जावा 6 और नीचे में एक संकलन त्रुटि देता है। आश्चर्यजनक रूप से, यह सुविधा प्रमुख रूप से प्रलेखित नहीं है; उदाहरण के लिए, इसका उल्लेख here नहीं किया गया here । यह बहस योग्य है अगर यह एक नई सुविधा है या एक बग फिक्स (या एक नई बग?), कुछ संबंधित जानकारी और चर्चा देखें । सर्वसम्मति मूल कल्पना में एक अस्पष्टता को इंगित करती है, जिसने जावा 5/6 पर थोड़ा गलत / असंगत कार्यान्वयन किया, जिसे 7 में तय किया गया था, क्योंकि यह जेएसआर 2 9 2 (गतिशील रूप से टाइप की गई भाषाओं) के कार्यान्वयन के लिए महत्वपूर्ण था।

जावा ऑटोबॉक्सिंग में अब कुछ और जाल और आश्चर्य हैं। उदाहरण के लिए

Object obj = new Integer(1234);
long x = (long)obj;

संकलित करेंगे, लेकिन रनटाइम पर ( ClassCastException साथ) विफल हो जाएंगे। यह, इसके बजाय, काम करेगा:

long x = (long)(int)obj;

मैंने जावा एसई 6 और जावा एसई 7 के बीच ऑटो अनबॉक्सिंग व्यवहार में एक अंतर देखा है। मुझे आश्चर्य है कि ऐसा क्यों है, क्योंकि मुझे इन दो संस्करणों के बीच इस व्यवहार में बदलावों का कोई दस्तावेज नहीं मिल रहा है।

यहां एक साधारण उदाहरण दिया गया है:

Object[] objs = new Object[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];

यह जावा एसई 7 से जावैक के साथ ठीक संकलित करता है। हालांकि, अगर मैं संकलक "-सोर्स 1.6" तर्क देता हूं तो मुझे अंतिम पंक्ति में एक त्रुटि मिलती है:

inconvertible types
found   : java.lang.Object
required: int

मैंने मूल संस्करण 6 कंपाइलर (बिना किसी संसाधन विकल्प के) के साथ संकलित करने के लिए जावा एसई 6 डाउनलोड करने का प्रयास किया। यह सहमत है और ऊपर की तरह एक ही त्रुटि देता है।

तो क्या देता है? कुछ और प्रयोगों से ऐसा लगता है कि जावा 6 में अनबॉक्सिंग केवल अनबॉक्स मान सकता है जो स्पष्ट रूप से (संकलित समय पर) बॉक्स किए गए प्रकार का है। उदाहरण के लिए, यह दोनों संस्करणों में काम करता है:

Integer[] objs = new Integer[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];

तो ऐसा लगता है कि जावा 6 और 7 के बीच, अनबॉक्सिंग सुविधा को बढ़ाया गया था ताकि यह एक छेड़छाड़ में (ऑब्जेक्ट समय पर) बिना ऑब्जेक्ट प्रकारों को कास्ट और अनबॉक्स कर सके, मान उचित बॉक्स वाले प्रकार का है। हालांकि, जावा भाषा विशिष्टता या ब्लॉग पोस्टिंग के माध्यम से पढ़ना जो जावा 7 के समय लिखा गया था, मुझे इस बात का कोई बदलाव नहीं दिख रहा है, इसलिए मैं सोच रहा हूं कि परिवर्तन क्या है और यह "फीचर" कहलाता है ?

बस एक जिज्ञासा: परिवर्तन के कारण, "गलत" अनबॉक्सिंग को ट्रिगर करना संभव है:

Object[] objs = new Float[2];
objs[0] = new Float(5);
int myInt = (int)objs[0];

यह ठीक संकलित करता है लेकिन रनटाइम पर क्लासकास्ट अपवाद देता है।

इस पर कोई संदर्भ?


यह धारा 5.5 में भाषा की तरह दिखता है जावा 7 जेएलएस के कास्टिंग रूपांतरण को जावा 5/6 जेएलएस में उसी खंड की तुलना में अपडेट किया गया था, संभवतः स्वीकृत रूपांतरणों को स्पष्ट करने के लिए।

जावा 7 जेएलएस कहते हैं

एक संदर्भ प्रकार की अभिव्यक्ति अनबॉक्सिंग रूपांतरण द्वारा त्रुटि के बिना एक प्राचीन प्रकार के कास्टिंग रूपांतरण से गुज़र सकती है।

जावा 5/6:

किसी संदर्भ प्रकार का मान अनबॉक्सिंग रूपांतरण (§5.1.8) द्वारा एक आदिम प्रकार पर डाला जा सकता है।

जावा 7 जेएलएस में संदर्भ प्रकारों से प्राइमेटिव्स तक स्वीकृत रूपांतरणों की एक तालिका (तालिका 5.1) भी शामिल है (यह तालिका जावा 5/6 जेएलएस में शामिल नहीं है)। यह स्पष्ट रूप से ऑब्जेक्ट से प्राइमेटिव्स को अनबॉक्सिंग के साथ संकुचित संदर्भ रूपांतरण के रूप में सूचीबद्ध करता है।

इस ईमेल में कारण समझाया गया है:

नीचे पंक्ति: अगर कल्पना। अनुमति देता है (ऑब्जेक्ट) (int) यह भी (int) (ऑब्जेक्ट) की अनुमति देनी चाहिए।







unboxing