2013-10-16 9 views
5

के बजाय कुछ एबस्ट्रक्लास> को विस्तारित करता है तो मान लें कि हमारे पास SomeAbstractClass नामक एक अमूर्त वर्ग के साथ जावा एप्लिकेशन है और इस सुपर क्लास के कम से कम 10 उप-वर्ग हैं।संग्रह का उपयोग क्या है <? संग्रह <SomeAbstractClass>

क्या बजाय जिस तरह से Collection<? extends SomeAbstractClass> में जेनरिक में इस सार सुपर वर्ग का उपयोग कर बस Collection<SomeAbstractClass>

का उपयोग करने का उपयोग शायद मैं जेनरिक अंदर कुछ बहुत ही मौलिक सामान याद किया।

+0

विस्तारित करता है। वास्तव में आप क्या जानना चाहते हैं। Http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html –

+0

"सूची शब्द सूची से अधिक प्रतिबंधित है क्योंकि पूर्व सूची से मेल खाता है टाइप नंबर केवल, जबकि बाद वाले प्रकार की संख्या या इसके किसी भी उप-वर्ग की सूची से मेल खाता है। " संसाधन से, ऊपर से जुड़े SURESH। – Fildor

+0

आप इसे देख सकते हैं। http://www.thejavageek.com/2013/08/28/generics-the-wildcard-operator/ –

उत्तर

4

इन दो घोषणाओं के बीच अंतर पता चलता ए) या अज्ञात वर्ग के किसी भी वर्ग के किसी भी वर्ग।

आप आइटम C2 क्योंकि संकलक क्या लिखते हैं यह है, केवल कि यदि आप इसे बाहर एक ए के लिए

आगे डाली जा सकती है, पता नहीं है नहीं जोड़ सकते हैं, आप असाइन नहीं कर सकते (यानी कास्ट) सी 1 से सी 2 - सी 1 सी 2 के प्रकार का उप-वर्ग नहीं है।

-2

आपके मामले में यह के बाद प्रकार सार है, लेकिन सामान्य Collection<SomeClass> में SomeClass और सभी यह उपवर्गों शामिल कर सकते हैं, जबकि Collection<? extends SomeClass>SomeClass शामिल नहीं हो सकता है, लेकिन केवल यह उपवर्गों है कोई फर्क नहीं पड़ता।

आप इसे स्वयं आज़मा सकते हैं।

List<Number> foo = new ArrayList<>(); 
foo.add(Integer.valueOf(0)); 

काम करता है, जबकि

List<? extends Number> foo = new ArrayList<>(); 
foo.add(Integer.valueOf(0)); 

नहीं करता है।

Collection<? extends A> c1; 
Collection<A> c2; 

है कि c2 एक या किसी उपवर्ग के उदाहरण पकड़ सकते हैं, लेकिन c1 एक की किसी अज्ञात लेकिन विशेष रूप से उपवर्ग के उदाहरण धारण कर सकते हैं (या: यह त्रुटि "The method add(capture#1-of ? extends Number) in the type List<capture#1-of ? extends Number> is not applicable for the arguments (Integer)"

+2

-1 पूरी तरह गलत है। सामान्य बाध्य '? एक्स 'में विस्तार' एक्स 'शामिल है - इसमें' एक्स' के उदाहरण भी हो सकते हैं। और "इसके" में कोई एस्ट्रोफ़े नहीं है ... तो – Bohemian

+0

"शब्द शब्द सूची से अधिक प्रतिबंधित है क्योंकि पूर्व केवल प्रकार संख्या की सूची से मेल खाता है, जबकि बाद वाले प्रकार की सूची से मेल खाता है या इसके किसी भी उप-वर्ग। " http://docs.oracle.com/javase/tutorial/java/generics/upperBounded.html से एक अलग कहानी बताती है ... – Fildor

+0

@ फ़िलडोर जो मुझे थोड़ा अजीब लगता है क्योंकि यह निश्चित रूप से वास्तविक व्यवहार से मेल नहीं खाता है। मेरे संपादन से उदाहरण देखें। –

0

नीचे not true in generics है,

Collection<? extends SomeAbstractClass> 
      ^
       | 
       | 
Collection<SomeAbstractClass> 

Collection<? extends SomeAbstractClass> और Collection<SomeAbstractClass> पूरी तरह से विभिन्न प्रकार और संबंधित नहीं हैं।

ध्यान दें कि,

को देखते हुए दो ठोस टाइप ए और बी (उदाहरण के लिए, संख्या और पूर्णांक), MyClass, MyClass करने के लिए कोई संबंध नहीं है के लिए किया जाए या ए और बी से संबंधित हैं नहीं परवाह किए बिना।

उदाहरण के लिए, List<Integer>List<Number> की एक उप-प्रकार भले ही पूर्णांक संख्या की एक उप-प्रकार है नहीं है।

1

जेनेरिक में वाइल्डकार्ड संग्रह प्रकार के लिए हैं और आमतौर पर तत्व संग्रहित नहीं होने के लिए हैं।

उदाहरण के लिए एक विधि की कल्पना करें जो तर्क List<Number> लेता है।

public void calculateSum(List<Number> numbers) { 
    for (Number n: numbers) { 
     // calculate Sum 
    } 
} 

अब, हम List<Integer> गुजर इस प्रकार से पूर्णांकों का योग की गणना करना चाहते हैं।(ध्यान दें कि IntegerNumber का एक उपवर्ग है)

List<Integer> integers= new ArrayList<Integer>(); 
//Populate collection 
calculateSum(integers); //Error 

इस के रूप में भले ही IntegersNumberList<Integers> की एक उप-प्रकार है काम नहीं करेगा एक उप प्रकार नहीं List<Number> की है। ध्यान दें कि List<Number> अभी भी स्टोर कर सकते हैं Integer, Float, Double आदि

तो, Number किसी भी प्रकार की राशि हम वाइल्डकार्ड का उपयोग के रूप में

public void calculateSum(List<? extends Number> numbers) { 
    for (Number n: numbers) { 
     // calculate Sum 
    } 
} 

इस राशि की गणना करेगा इस प्रकार की गणना करने के लिए एक सामान्य विधि के लिए किसी भी प्रकार की संख्या के मुताबिक उस प्रकार Number

संबंधित मुद्दे