? extends HasWord
का अर्थ है "एक वर्ग / इंटरफ़ेस जो विस्तारित होता है HasWord
।" दूसरे शब्दों में, HasWord
स्वयं या इसके किसी भी बच्चे ... मूल रूप से कुछ भी जो instanceof HasWord
प्लस के साथ काम करेगा null
।
अधिक तकनीकी शब्दों में, ? extends HasWord
एक बाउंडेड वाइल्डकार्ड है, जो प्रभावी जावा 3 संस्करण के 31 आइटम में शामिल है , जो पेज 139 पर शुरू होता है। 2 डी संस्करण से एक ही अध्याय पीडीएफ के रूप में ऑनलाइन उपलब्ध है ; बाउंडेड वाइल्डकार्ड पर हिस्सा आइटम 28 पेज 134 पर शुरू हो रहा है।
अपडेट: पीडीएफ लिंक अपडेट किया गया था क्योंकि ओरेकल ने इसे कुछ समय पहले हटा दिया था। अब यह क्वीन मैरी यूनिवर्सिटी ऑफ लंदन के स्कूल ऑफ इलेक्ट्रॉनिक इंजीनियरिंग एंड कंप्यूटर साइंस द्वारा आयोजित कॉपी की ओर इशारा करता है।
अपडेट 2: आओ हम थोड़ा और विस्तार करें कि आप वाइल्डकार्ड का उपयोग क्यों करना चाहते हैं।
यदि आप एक ऐसी विधि घोषित करते हैं जिसके हस्ताक्षर से आप पास होने की उम्मीद करते हैं List<HasWord>
, तो केवल एक चीज जिसे आप पास कर सकते हैं वह है ए List<HasWord>
।
हालाँकि, अगर कहा जाता है कि हस्ताक्षर थे List<? extends HasWord>
तो आप List<ChildOfHasWord>
इसके बजाय पास कर सकते थे ।
ध्यान दें कि List<? extends HasWord>
और के बीच एक सूक्ष्म अंतर है List<? super HasWord>
। जैसा कि यहोशू बलोच ने कहा: PECS = निर्माता-विस्तार, उपभोक्ता-सुपर।
इसका मतलब यह है कि यदि आप एक संग्रह में गुजर रहे हैं जो आपकी विधि से डेटा को खींचता है (यानी संग्रह आपकी उपयोग करने की विधि के लिए तत्वों का उत्पादन कर रहा है), तो आपको उपयोग करना चाहिए extends
। यदि आप किसी ऐसे संग्रह से गुजर रहे हैं जिसमें आपकी विधि डेटा जोड़ती है (अर्थात संग्रह आपके द्वारा बनाए गए तत्वों का उपभोग कर रहा है), तो इसका उपयोग करना चाहिए super
।
यह भ्रामक लग सकता है। हालाँकि, आप इसे List
's sort
कमांड में देख सकते हैं (जो कि कलेक्शंस के दो-arg वर्जन का शॉर्टकट है। Sort)। इसके बजाय Comparator<T>
, यह वास्तव में एक लेता है Comparator<? super T>
। इस स्थिति में, तुलनित्र List
सूची को पुन: क्रम में करने के लिए तत्वों का उपभोग कर रहा है।