"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > मैं वाइल्डकार्ड जेनेरिक प्रकार (`? एक्सटेंड्स पैरेंट`) के साथ जावा संग्रह में तत्व क्यों नहीं जोड़ सकता?

मैं वाइल्डकार्ड जेनेरिक प्रकार (`? एक्सटेंड्स पैरेंट`) के साथ जावा संग्रह में तत्व क्यों नहीं जोड़ सकता?

2024-12-17 को प्रकाशित
ब्राउज़ करें:550

Why Can't I Add Elements to a Java Collection with a Wildcard Generic Type (`? extends Parent`)?

प्रकार सुरक्षा और वाइल्डकार्ड जेनरिक: निषिद्ध संशोधक को समझना

जावा में जेनेरिक संग्रह के साथ काम करते समय, वाइल्डकार्ड जेनेरिक की अवधारणा कुछ खास पेश कर सकती है सीमाएँ जो प्रारंभ में प्रतिकूल लग सकती हैं। एक प्रमुख उदाहरण वाइल्डकार्ड जेनेरिक प्रकार के साथ जावा संग्रह में मान जोड़ने में असमर्थता है।

निम्नलिखित कोड स्निपेट पर विचार करें:

List extends Parent> list = ...;
Parent p = factory.get(); // returns concrete implementation
list.set(0, p); // fails here: set(int, ? extends Parent) cannot be applied to (int, Parent)

यह कोड संकलित करने में विफल क्यों होता है? उत्तर अंतर्निहित सुरक्षा तंत्र में निहित है जो वाइल्डकार्ड जेनेरिक द्वारा लागू किया जाता है।

अप्रतिबंधित पुनर्प्राप्ति और प्रतिबंधित जोड़ का सिद्धांत

वाइल्डकार्ड जेनेरिक प्रकार, द्वारा दर्शाया गया है? पेरेंट का विस्तार, उन तत्वों की एक सूची का प्रतिनिधित्व करता है जो पेरेंट इंटरफ़ेस के वंशज हैं। हालांकि यह इन तत्वों की अप्रतिबंधित पुनर्प्राप्ति की अनुमति देता है, प्रकार सुरक्षा संग्रह में मान जोड़ने पर प्रतिबंध निर्धारित करती है।

यदि कोड को संकलित करने की अनुमति दी गई थी, तो यह सूची के भीतर एक तत्व को मूल उदाहरण के असाइनमेंट की अनुमति देगा। हालाँकि, यह क्रिया संभावित रूप से प्रकार की सुरक्षा को तोड़ सकती है।

निम्न परिदृश्य पर विचार करें:

List childList = new ArrayList();
childList.add(new Child());

List extends Parent> parentList = childList;
parentList.set(0, new Parent());

Child child = childList.get(0); // No! It's not a child! Type safety is broken...

इस परिदृश्य में, चाइल्ड ऑब्जेक्ट की एक सूची को ? की सूची में डाल दिया जाता है। माता-पिता का विस्तार करता है। सूची के पहले तत्व के लिए मूल उदाहरण का बाद का असाइनमेंट प्रकार की सुरक्षा का उल्लंघन करता है, क्योंकि परिणामी सूची में एक ऐसा तत्व होता है जो वैध बाल उदाहरण नहीं है।

अपरिवर्तनीय प्रकार की सुरक्षा सुनिश्चित करना

वाइल्डकार्ड जेनेरिक संग्रह में मूल्यों को जोड़ने पर रोक लगाकर, जावा अपरिवर्तनीय प्रकार की सुरक्षा लागू करता है। यह सुनिश्चित करता है कि सूची के तत्व हमेशा उसके घोषित प्रकार द्वारा लगाए गए बाधाओं का पालन करते हैं।

इस प्रतिबंध के अभाव में, प्रकार की सुरक्षा से समझौता किया जाएगा, जिससे संभावित त्रुटियां और अप्रत्याशित व्यवहार होगा।

नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3