मैंने जावा एसई 6 और जावा एसई 7 के बीच ऑटो अनबॉक्सिंग व्यवहार में अंतर देखा है। मैं सोच रहा हूं कि ऐसा क्यों है, क्योंकि मैं इन दो संस्करणों के बीच इस व्यवहार में बदलाव का कोई दस्तावेज नहीं पा सकता हूं।
यहाँ एक सरल उदाहरण दिया गया है:
Object[] objs = new Object[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];
यह जावा एसई 7 से जेवैक के साथ ठीक संकलित करता है। हालांकि, यदि मैं कंपाइलर को "-source 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];
यह ठीक संकलित करता है, लेकिन रनटाइम पर एक ClassCastException देता है।
इस पर कोई संदर्भ?
Integer obj = new Integer(2); int x = (int)obj;
: जावा 7 पर काम करता है, जावा 6. पर त्रुटि देता है