2012-07-26 1 views
5

कहाँ कर सकते हैं हम ArrayList<? extends My_Class> क्योंकि यह यदि आप इसे इस तरह से की घोषणा करते हैं कि आप किसी नए तत्व जोड़ने के लिए अनुमति नहीं दी जाएगी:हम ArrayList <का उपयोग कहां कर सकते हैं? फैली My_Class>

ArrayList<? extends My_Class> obj=new ArrayList<? extends My_Class>(); 
list.add(new Derived_My_Class()); //this is compilation error 
+0

संभावित डुप्लिकेट [वन्यकार्ड जेनेरिक संग्रह में तत्वों को कैसे जोड़ा जा सकता है?] (http://stackoverflow.com/questions/176446/how-can-elements- बी-एडेड-टू-ए-वाइल्डकार्ड-जेनेरिक-संग्रह) –

उत्तर

5

इन खोजशब्दों वर्णन करने के लिए व्यापक रूप से इस्तेमाल परिवर्णी शब्द है: पी ई सी एस: निर्माता विस्तार - उपभोक्ता सुपर।

इसलिए, यदि आप अपने संग्रह को "विस्तारित" करते हैं तो दिए गए प्रकार के तत्व उत्पन्न करता है। तो आप इसमें शामिल नहीं कर सकते हैं, आप केवल इससे ही ले सकते हैं।

public List<? extends CharSequence> getFoo() { 
    List<String> list = new ArrayList<String>(); 
    list.add("foo"); 
    return list; 
} 

संबंधित: Java generics: Collections.max() signature and Comparator

+0

इसका लाभ क्या है जिससे हम इसे प्राप्त करने का प्रयास कर रहे हैं, मुझे समझ में नहीं आ रहा है क्योंकि इस विधि के कॉलर को प्रकार की एक चर को परिभाषित करना चाहिए यहां तक ​​कि भी सूचीबद्ध नहीं है और बाद में आप प्राप्त चर को संशोधित नहीं कर सकते हैं, इसलिए मुझे समझ में नहीं आता कि हमें इसकी आवश्यकता क्यों है – user1554627

2

आप सही हैं, अपने ArrayList जिस तरह से यह प्राप्त होता है नहीं किया जा सकता:

एक उदाहरण उपयोग एक सूची के साथ अपने एपीआई के एक ग्राहक प्रदान करने के लिए किया जाएगा वहाँ ऐसा कुछ नहीं है जिसे आप इसमें डाल सकते हैं।

My_Class को संग्रहीत करने के लिए आप क्या चाहते हैं और इसके सबक्लास बस ArrayList<My_Class> है; यह My_Class और इसकी सभी DerivedClass की वस्तुओं को सही ढंग से ले जाएगा।

0

खैर ... वहाँ कोई मतलब नहीं एक इस तरह ArrayList घोषणा करेंगे है, बल्कि अपने इरादों लेखन

ArrayList < महाप्रकार> obj = नए ArrayList < महाप्रकार>() द्वारा fullfilled किया जाएगा;

मेरी उदासीनता के अनुसार, मैंने इस तर्क को विधि तर्कों में देखा है, जहां आप उम्मीद करते हैं कि आपके कॉलर को विशेष सुपरटेप के उपप्रकारों का संग्रह प्रदान करने की उम्मीद है (या उपरोक्त किसी व्यक्ति के रूप में विधि से वापस लौटें)। की तरह इस प्रकार

public getAnimals(List< ? extends Animal> obj){ 

obj.add(something); //not allowed 

} 

निष्पक्ष संभावना है कि आप निश्चित प्रकार की अपनी सूची में गदहे, बंदरों और पक्षियों आदि जोड़ सकते हैं कहते हैं कि (बंदर) कर रहे हैं। और कक्षा से प्राप्त होने के दौरान क्लासएक्सप्शन प्राप्त करें।

यही कारण है कि इस मामले में इसकी अनुमति नहीं है। जोश ब्लोच द्वारा प्रभावी जावा पढ़ें। उन्होंने निर्माता उपभोक्ता समानता (पीईसीएस)

+0

अहम ... क्या? हां, यह वही है जो मैं कुछ मामलों में चाहता हूं। सवाल –

+0

का मानना ​​नहीं है कि गधे, बंदरों और पक्षियों में से सभी 'पशु' से प्राप्त होते हैं ... उन्हें 'ArrayList ' में संग्रहीत करने में क्या समस्या है ?? और ... संभावित आपदा कहां है ?? –

+0

मुझे उम्मीद है कि मैं खुद को मूर्ख नहीं मानूंगा। मुझे खेद है .. अद्यतन उत्तर देखें – Ahmad