मूलतः List<? extends String>
एक अज्ञात प्रकार की एक सूची है, वह सब जानते हैं कि इस प्रकार की स्ट्रिंग फैली हुई है। इससे कोई फर्क नहीं पड़ता कि चर में List<String>
का उदाहरण शामिल है।
अब स्ट्रिंग अंतिम है, इसलिए वहाँ कोई उपवर्ग है ... तो चलो पर विचार करते हैं:
List<? extends A> list = new ArrayList<A>();
जहां A
एक उपवर्ग B
के साथ कुछ वर्ग है। उपयोग किए जाने पर, List<? extends A>
प्रकार का एक चर List<B>
का उदाहरण हो सकता है। हम A
को इसमें जोड़ नहीं सकते क्योंकि संभावना है कि A
B
नहीं है।
लेकिन आप जानते हैं कि यह सही होगा? खैर, कंपाइलर नहीं है, और न ही यह अज्ञात प्रकार और आपके द्वारा तत्काल किए गए लॉजिकल कनेक्शन की अपेक्षा करता है, क्योंकि सामान्य रूप से आप रनटाइम पर उस चर को बदल सकते हैं।
ऐसा ही एक उदाहरण ट्यूटोरियल आशावादी More Fun with Wildcards नाम है, जहां एक विधि (Set<T>, T)
स्वीकार करता है और एक अवैध कॉल (Set<?>, String)
का उपयोग कर यद्यपि Set<?>
चर Set<String>
का एक उदाहरण शामिल preposed है में मौजूद हैं। extends
के अतिरिक्त होने के बावजूद यह मुद्दा यहां समान है।
यह वास्तव में समझ में नहीं आता है, क्योंकि 'स्ट्रिंग' एक ** अंतिम ** कक्षा है! ऐसी कोई कक्षा नहीं है जो 'स्ट्रिंग' का विस्तार कर सके। इसलिए, केवल एक चीज आपको इसे करना चाहिए 'इसे' के रूप में परिभाषित करें। –
bobbel
लेकिन यह ऐरेलिस्ट के संदर्भ को कैसे ले रहा है जिसमें स्ट्रिंग को ऑब्जेक्ट के रूप में रखा गया है? –
क्योंकि 'सूची' सूची 'संतुष्ट करता है स्ट्रिंग> 'बढ़ाता है। अंतर यह है कि * स्ट्रिंग एक स्ट्रिंग है * लेकिन * स्ट्रिंग एक नहीं हो सकता है? वह एक स्ट्रिंग * है। –
Linus