मैं सी ++ टेम्पलेट्स और सी # जेनेरिक के बारे में एक चर्चा पढ़ रहा था, और वे जावा के प्रकार-मिटाए गए जेनेरिक से अलग कैसे हैं। मैंने एक बयान पढ़ा जो कहा कि जावा अभी भी रनटाइम पर कास्टिंग का उपयोग करता है, उदाहरण के लिए संग्रह से निपटने पर। यदि यह सच है, तो मुझे इसके बारे में पता नहीं था!जावा जेनेरिक रनटाइम पर कास्टिंग का उपयोग कब करते हैं?
ArrayList<SomeClass> list = new ArrayList<SomeClass>();
...
SomeClass object = list.get(0);
मेरा प्रश्न है:
कहते हैं कि मैं इस तरह के रूप कोड करते हैं। क्या यह प्रभावी रूप से
ArrayList list = new ArrayList();
...
SomeClass object = (SomeClass) list.get(0);
यदि संकलित है, तो क्यों? मैंने सोचा कि तथ्य यह है कि सूची ArrayList<SomeClass>
गारंटी है, संकलित समय और रन टाइम पर, केवल कुछ क्लास ArrayList के अंदर संग्रहीत किया जाएगा? या क्या आप कभी भी ArrayList<OtherClass>
को ArrayList<SomeClass>
में बदलने के लिए असुरक्षित प्रकार-कास्टिंग कर सकते हैं?
क्या ऐसे कई मौके हैं जहां जावा जेनेरिक में रनटाइम प्रकार कास्टिंग किया जाता है?
अंत में, यदि रन टाइम पर कास्टिंग वास्तव में उपयोग किया जाता है, तो क्या ऐसे अवसर होते हैं जब जेआईटी रन टाइम कास्ट चेक को बढ़ा सकता है?
(कृपया उत्तर देने/टिप्पणी करने से बचें कि माइक्रो-ऑप्टिमाइज़ेशन इसके लायक नहीं हैं, प्रीपेप्टिव ऑप्टिमाइज़ेशन सभी बुराइयों की जड़ है, आदि। मैं इन्हें अन्य समान प्रश्नों पर देखता हूं। ये अंक अच्छी तरह से समझते हैं, लेकिन वे दूर नहीं लेते यह समझने की कोशिश करने का मुद्दा कि कैसे टाइप-मिस्ड जेनरिक हुड के तहत लागू किए जाते हैं।)
आपके पास बहुत सारे प्रश्न हैं। लेकिन इसका उत्तर नीचे आता है: संकलन समय त्रुटि – ControlAltDel
की जांच में सुधार करने के लिए जावा जेनरिकों को रखा गया था यह ओरेकल (सूर्य) द्वारा प्रदान की गई विभिन्न जेनरिक जानकारी और ट्यूटोरियल द्वारा बहुत अधिक कवर किया गया है। पिछड़े संगतता को बनाए रखने के लिए जेनरिक को संकलन-समय सुविधा के रूप में बोल्ड किया गया था। http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf –
स्लाक्स, रिचेंटे और एड्रियानो के उत्तरों ने मुझे सभी को स्पष्ट किया। नीचे की रेखा क्या है @ user1291492 का उल्लेख है, जेनेरिक मुख्य रूप से संकलन समय त्रुटि जांच के लिए हैं। यह अभी भी थोड़ा अस्पष्ट है कि जेआईटी क्या करता है। और यह अभी भी मुझे लगता है कि यदि आप जावा के अर्थशास्त्र ने असुरक्षित रूपांतरणों (जैसे 'ऐरेलिस्ट' को 'ऐरेलिस्ट ' में अनुमति देने की अनुमति नहीं दी है, तो यह रनटाइम चेक को ऑप्टिमाइज़ कर सकता है लेकिन यह किसी अन्य प्रश्न का विषय है। मैं रिचेंटे के जवाब को "सही" के रूप में चुनता हूं, संकलन और पृथक्करण में शामिल प्रयास के लिए (धन्यवाद!)। –
Max