दिलचस्प पोस्ट
कैलेंडर दृश्य शैली बदलें PHP विशेषताएँ क्यों नहीं कार्य करता है? 64-बिट आर्किटेक्चर पर यह कोड segfault क्यों करता है लेकिन 32-बिट पर ठीक काम करता है? Android में गतिविधि का शीर्षक कैसे बदलें? आईफ़ोन 6 और 6 प्लस मीडिया क्वेरीज़ सी # वर्गों और सदस्यों (क्षेत्रों, विधियों, आदि) के लिए डिफ़ॉल्ट दृश्यता? COM ऑब्जेक्ट को अपनी अंतर्निहित RCW से अलग कर दिया गया है जिसका इस्तेमाल नहीं किया जा सकता गैर-संख्यात्मक वर्णों को हटाने के लिए टी-एसक्यूएल का चयन करें आईओएस 9 की नई सुविधा निशुल्क प्रोविजनिंग (ऐप्पल डेवलपर सदस्यता के बिना, केवल आपकी ऐप्पल आईडी के साथ, डिवाइस पर अपना ऐप चलाएं) जावा: फ़्लेमराइटर: एक नई लाइन बनाएं पाठ इनपुट तत्व में पाठ के अंत में कर्सर लगाने के लिए जावास्क्रिप्ट का उपयोग करें मल्टीथरेडिंग पहेलियाँ Log4j2 में एक कस्टम एपेन्डर कैसे बनाएं? जांच करें कि कोई अनुरोध प्राप्त है या पोस्ट सी ++ 11 में, क्या `i + = ++ i + 1` का प्रदर्शन अनिर्धारित व्यवहार करता है?

जावा जेनेरिक्स (वाइल्डकार्ड)

जावा में सामान्य वाइल्डकार्ड के बारे में मेरे पास कुछ सवाल हैं:

  1. List<? extends T> क्या अंतर है List<? extends T> List<? extends T> और List<? super T> List<? super T> ?

  2. एक सीमित वाइल्डकार्ड क्या है और एक असीम वाइल्डकार्ड क्या है?

Solutions Collecting From Web of "जावा जेनेरिक्स (वाइल्डकार्ड)"

अपने पहले प्रश्न में, <? extends T> <? extends T> और <? super T> <? super T> सीमित वाइल्डकार्ड के उदाहरण हैं। एक असीम वाइल्डकार्ड <?> जैसा दिखता है, और मूल रूप से <? extends Object> <? extends Object> इसका ढीला मतलब है कि जेनेरिक किसी प्रकार का हो सकता है। एक बाध्य वाइल्डकार्ड ( <? extends T> या <? super T> ) प्रकार पर एक प्रतिबंध को कहकर कहता है कि उसे किसी विशिष्ट प्रकार का विस्तार करना है ( <? extends T> को ऊपरी सीमा के रूप में जाना जाता है), या एक विशिष्ट प्रकार का एक पूर्वज ( <? super T> को निचला बाउंड के रूप में जाना जाता है)।

जावा ट्यूटोरियल में वाइल्डकार्ड्स के साथ जेनरिक के कुछ बहुत अच्छा स्पष्टीकरण और वाइल्डकार्ड्स के साथ अधिक मज़ा है ।

यदि आपके पास एक कक्षा पदानुक्रम ए है, बी A का एक उपवर्ग है, और सी और डी दोनों नीचे बी की उप-श्रेणी हैं

 class A {} class B extends A {} class C extends B {} class D extends B {} 

फिर

 List<? extends A> la; la = new ArrayList<B>(); la = new ArrayList<C>(); la = new ArrayList<D>(); List<? super B> lb; lb = new ArrayList<A>(); //fine lb = new ArrayList<C>(); //will not compile public void someMethod(List<? extends B> lb) { B b = lb.get(0); // is fine lb.add(new C()); //will not compile as we do not know the type of the list, only that it is bounded above by B } public void otherMethod(List<? super B> lb) { B b = lb.get(0); // will not compile as we do not know whether the list is of type B, it may be a List<A> and only contain instances of A lb.add(new B()); // is fine, as we know that it will be a super type of A } 

एक बाध्य वाइल्डकार्ड की तरह है ? extends B ? extends B जहां बी कुछ प्रकार होता है। यही है, प्रकार अज्ञात है लेकिन उस पर "बाध्य" रखा जा सकता है इस मामले में, यह कुछ वर्ग से घिरा है, जो बी का उप-वर्ग है।

जोश बलोच में super का उपयोग करने के बारे में अच्छी जानकारी है और इस GoogleiO वीडियो टॉक में extends है जहां उन्होंने उल्लेख किया है कि निर्माता उपभोक्ता super स्मरक का extends

प्रस्तुति स्लाइड्स से:

मान लें कि आप Stack<E> लिए बल्क विधियों को जोड़ना चाहते हैं

void pushAll(Collection<? extends E> src);

– src एक ई निर्माता है

void popAll(Collection<? super E> dst);

– डीएसटी ई उपभोक्ता है I

ऐसे समय हो सकते हैं जब आप उन प्रकार के प्रकारों को प्रतिबंधित करना चाहें, जिन्हें एक प्रकार पैरामीटर में पारित करने की अनुमति दी जाती है उदाहरण के लिए, संख्याओं पर चलने वाली एक विधि संख्या या इसके उपवर्गों के उदाहरणों को स्वीकार कर सकती है यह वही है जिसके लिए सीमित मान पैरामीटर हैं।

 Collection<? extends MyObject> 

का अर्थ है कि वह सभी ऑब्जेक्ट को स्वीकार कर सकता है, जो आईओएस- MyObject के साथ संबंध है (यानी किसी ऑब्जेक्ट का एक प्रकार है IObject या हम किसी भी ऑब्जेक्ट के उपवर्ग के कोई ऑब्जेक्ट कह सकते हैं) या MyObject क्लास के ऑब्जेक्ट

उदाहरण के लिए:

 class MyObject {} class YourObject extends MyObject{} class OurObject extends MyObject{} 

फिर,

 Collection<? extends MyObject> myObject; 

केवल MyObject या MyObject के बच्चों को स्वीकार करेंगे (यानी हमारा ऑब्जेक्ट या ऑबजेक्ट या मायऑबैक्ट प्रकार के किसी भी ऑब्जेक्ट, लेकिन मायऑब्स के सुपरक्लास का कोई भी ऑब्जेक्ट नहीं)।

सामान्य रूप में,

यदि एक संरचना में एक प्रकार के तत्व होते हैं ? extends E ? extends E , हम संरचना से तत्व प्राप्त कर सकते हैं, लेकिन हम तत्वों को संरचना में नहीं डाल सकते

 List<Integer> ints = new ArrayList<Integer>(); ints.add(1); ints.add(2); List<? extends Number> nums = ints; nums.add(3.14); // compile-time error assert ints.toString().equals("[1, 2, 3.14]"); 

तत्वों को संरचना में रखने के लिए हमें किसी अन्य प्रकार की वाइल्डकार्ड की आवश्यकता है जिसे Wildcards with super वाइल्डकार्ड कहा जाता है,

  List<Object> objs = Arrays.<Object>asList(2, 3.14, "four"); List<Integer> ints = Arrays.asList(5, 6); Collections.copy(objs, ints); assert objs.toString().equals("[5, 6, four]"); public static <T> void copy(List<? super T> dst, List<? extends T> src) { for (int i = 0; i < src.size(); i++) { dst.set(i, src.get(i)); } } 

जेनेरिक वाइल्डकार्ड को ऐसे तरीकों बनाने के लिए बनाया जाता है जो संग्रहण पर पुन: उपयोग करने योग्य हैं।

उदाहरण के लिए, यदि किसी पद्धति में पैरामीटर की List<A> , तो हम केवल इस विधि के लिए List<A> दे सकते हैं कुछ परिस्थितियों में इस पद्धति के मकसद के लिए यह बर्बाद है:

  1. यदि यह विधि केवल List<A> से ऑब्जेक्ट List<A> , तो हमें इस पद्धति की List<A-sub> देने List<A-sub> अनुमति दी जानी चाहिए। (क्योंकि ए-सब एक ए है)
  2. यदि यह विधि केवल List<A> लिए वस्तुओं को सम्मिलित List<A> , तो हमें इस विधि को List<A-super> देने List<A-super> अनुमति दी जानी चाहिए। (क्योंकि ए एक ए-सुपर है)