2016-01-30 4 views
5
List<? extends String> list = new Arraylist<String>(); 
list.add("foo"); 
List<? extends String> list = new Arraylist<String>(); 
list.add("foo"); 

कोड के दिए गए टुकड़े मुझे संकलित समय त्रुटि देता है। मुझे यह नहीं मिलता है कि मैं सूची में स्ट्रिंग क्यों नहीं जोड़ सकता। लेकिन कोड हम स्ट्रिंग वर्ग वस्तु जोड़ सकते हैं और यह सूची में व्युत्पन्न वर्ग वस्तु अभी भी मैं त्रुटि हो रही है का मतलब है क्योंसूची

+1

यह वास्तव में समझ में नहीं आता है, क्योंकि 'स्ट्रिंग' एक ** अंतिम ** कक्षा है! ऐसी कोई कक्षा नहीं है जो 'स्ट्रिंग' का विस्तार कर सके। इसलिए, केवल एक चीज आपको इसे करना चाहिए 'इसे ' के रूप में परिभाषित करें। – bobbel

+0

लेकिन यह ऐरेलिस्ट के संदर्भ को कैसे ले रहा है जिसमें स्ट्रिंग को ऑब्जेक्ट के रूप में रखा गया है? –

+0

क्योंकि 'सूची ' सूची 'संतुष्ट करता है 'बढ़ाता है। अंतर यह है कि * स्ट्रिंग एक स्ट्रिंग है * लेकिन * स्ट्रिंग एक नहीं हो सकता है? वह एक स्ट्रिंग * है। – Linus

उत्तर

2

List<?> केवल जब आप आइटम के डेटा प्रकार के साथ संबंध नहीं हैं इस्तेमाल किया जाना चाहिए और,

public int getSize(List<?> itemList) { 
    return itemList.size(); 
} 

यह एक Read Only सूची के अधिक है ऐसी सूची आदि

उदाहरण के लिए की हो रही आकार के रूप में संचालन में रुचि।

यदि आप String आइटमों की एक नई सूची बनाने का इरादा रखते हैं तो आपको निम्न का उपयोग करना चाहिए।

List<String> list = new Arraylist<>(); 
list.add("foo"); 

वैकल्पिक रूप से, आप इस का उपयोग कर सकते हैं:

List<Object> list = new Arraylist<>(); 
list.add("foo"); 
1

यह काम करेगा:

List<? super String> list = new ArrayList<String>(); 
list.add("foo"); 

फिर अपने संकलक अब, कि फोन करने वाले है वस्तुओं रहे हैं की एक सूची पारित करने के लिए होगा String या एक सुपर प्रकार।

जब आप कहते हैं <? extends String> इसका मतलब है कि यह किसी भी प्रकार का हो सकता है जो String फैलाता है। इसका मतलब है कि कोई List पास कर सकता है और यह इसे स्वीकार करेगा।

देखो भी यहाँ: Difference for <? super/extends String> in method and variable declaration

1

मूलतः List<? extends String> एक अज्ञात प्रकार की एक सूची है, वह सब जानते हैं कि इस प्रकार की स्ट्रिंग फैली हुई है। इससे कोई फर्क नहीं पड़ता कि चर में List<String> का उदाहरण शामिल है।

अब स्ट्रिंग अंतिम है, इसलिए वहाँ कोई उपवर्ग है ... तो चलो पर विचार करते हैं:

List<? extends A> list = new ArrayList<A>(); 

जहां A एक उपवर्ग B के साथ कुछ वर्ग है। उपयोग किए जाने पर, List<? extends A> प्रकार का एक चर List<B> का उदाहरण हो सकता है। हम A को इसमें जोड़ नहीं सकते क्योंकि संभावना है कि AB नहीं है।

लेकिन आप जानते हैं कि यह सही होगा? खैर, कंपाइलर नहीं है, और न ही यह अज्ञात प्रकार और आपके द्वारा तत्काल किए गए लॉजिकल कनेक्शन की अपेक्षा करता है, क्योंकि सामान्य रूप से आप रनटाइम पर उस चर को बदल सकते हैं।

ऐसा ही एक उदाहरण ट्यूटोरियल आशावादी More Fun with Wildcards नाम है, जहां एक विधि (Set<T>, T) स्वीकार करता है और एक अवैध कॉल (Set<?>, String) का उपयोग कर यद्यपि Set<?> चर Set<String> का एक उदाहरण शामिल preposed है में मौजूद हैं। extends के अतिरिक्त होने के बावजूद यह मुद्दा यहां समान है।