Why doesn't Java complain about generic map casting? -


  वस्तु स्ट्रिंगमैप = नया हैशमॉप & lt; स्ट्रिंग, स्ट्रिंग & gt; () {{put ("1", "a" ); }}; मानचित्र & lt; पूर्णांक, स्ट्रिंग & gt; IntegerMap = (नक्शा और लेफ्टिनेंट; पूर्णांक, स्ट्रिंग & gt;) स्ट्रिंगमैप; // जावा रन-टाइम में एक अपवाद क्यों नहीं फेंकता? // मुझे पता है कि यह एक समस्या नहीं है यदि स्ट्रिंगमैप मैप & lt; स्ट्रिंग, स्ट्रिंग & gt; के रूप में घोषित किया गया है। // हालांकि, ऊपर वास्तविक कोड स्प्रिंग बीन का प्रयोग कर रहा था। // मैप & lt; पूर्णांक, स्ट्रिंग & gt; IntegerMap = (नक्शा और लेफ्टिनेंट; पूर्णांक, स्ट्रिंग & gt;) context.getBean ("नक्शा"); Println (integerMap.get (1)); // प्रिंट नल सिस्टम। आउट.प्रिंटलाइन (integerMap.get ("1")); // प्रिंट करता है   

Q1 क्यों जावा रन-टाइम में इस तरह के कास्टिंग की अनुमति देता है?

Q2। बीन का उपयोग करते समय, इस त्रुटि से बचने के लिए सबसे अच्छा अभ्यास क्या है?

Q1 क्योंकि रन-टाइम में, सभी जेनेरिक जानकारी पहले ही छीन ली गई है, इसलिए दो मानचित्र प्रकार रन-टाइम पर्यावरण के लिए अलग-अलग नहीं हैं संकलक लागू प्रकार सुरक्षा में मदद करने के लिए जेनेरिक केवल यही है को उद्धृत करने के लिए:

जेनरिक्स को प्रकार के विलोपन के द्वारा लागू किया जाता है: सामान्य प्रकार की सूचना केवल संकलन समय पर मौजूद होती है, जिसके बाद इसे संकलक द्वारा मिटा दिया जाता है। इस दृष्टिकोण का मुख्य लाभ यह है कि यह जेनेरिक कोड और लीगेसी कोड के बीच पूर्ण अंतर को प्रदान करता है जो गैर-पैरामीटर वाले प्रकारों का उपयोग करता है (जो तकनीकी रूप से कच्चे प्रकार के रूप में जाना जाता है)। मुख्य नुकसान यह है कि पैरामीटर प्रकार की जानकारी रन-टाइम पर उपलब्ध नहीं होती है, और यह कि स्वचालित रूप से व्युत्पन्न कब्ज विफल हो सकती है जब बीमार व्यवहार वाले विरासत कोड के साथ इंटरऑपरेट किया जा सकता है।

प्रश्न 2। कच्चे टाइप किए गए मानचित्र का उपयोग न करें यदि आपको करना है, तो वास्तव में वास्तव में सावधान रहें जब आप उन्हें टाइप करें।

Comments