2010-02-11 13 views
25

मैं संग्रह के लिए get and put principle समझता हूं: यदि कोई विधि संग्रह में ले जाती है कि यह एक प्रकार टी लिखने के लिए, पैरामीटर Collection<? super T> होना चाहिए, जबकि यदि यह एक पढ़ेगा टी टाइप करें, पैरामीटर Collection<? extends T> होना चाहिए।जावा जेनरिक: संग्रह। मैक्स() हस्ताक्षर और तुलनात्मक

लेकिन किसी Collections.max() हस्ताक्षर कृपया समझा सकता है:

public static <T> T max(Collection<? extends T> coll, 
        Comparator<? super T> comp) 

विशेष रूप से कारण है कि यह Comparator<? super T> बजाय Comparator<? extends T> है?

उत्तर

65

जोश ब्लोच का निमोनिक पीईसीएस यहां उपयोगी है। यह खड़ा के लिए:

निर्माता extends, उपभोक्ता super

इसका मतलब यह है कि जब एक पैरामिट्रीकृत प्रकार एक पद्धति के लिए पारित किया जा रहा T की उदाहरणों (वे किसी तरह से यह से प्राप्त किया जाएगा), ? extends T चाहिए उत्पादन करेगा इस्तेमाल किया जाए, क्योंकि T के उप-वर्ग के किसी भी उदाहरण को T भी है।

एक पैरामिट्रीकृत प्रकार एक विधि T की उदाहरणों (वे इसे करने के लिए पारित हो जाएगा कुछ करने के लिए), T का एक उदाहरण कानूनी तौर पर कोई भी तरीका है कि स्वीकार करने के लिए पारित किया जा सकता है क्योंकि ? super T इस्तेमाल किया जाना चाहिए की खपत होगी करने के लिए पारित किया जा रहा जब T के कुछ सुपरटेप। उदाहरण के लिए Comparator<Number>Collection<Integer> पर उपयोग किया जा सकता है। ? extends T काम नहीं करेगा, क्योंकि Comparator<Integer>Collection<Number> पर काम नहीं कर सका।

संपादित करें:

public T something(); 
    ^

ऊपर एक विधि है कि T का उत्पादन होता है: प्राप्त/पुट (उत्पादन/उपभोग) पर एक छोटे से अधिक स्पष्ट करने के लिए।

public void something(T t); 
        ^

उपरोक्त एक तरीका है जो T का उपभोग करता है।

"निर्माता extends, उपभोक्ता super" इस ऑब्जेक्ट का उपयोग करने के लिए पैरामीटरयुक्त ऑब्जेक्ट को किस तरीके से पारित किया जा रहा है, इस पर लागू होता है। Collections.max() के मामले में, आइटम Collection से पुनर्प्राप्त किए जाएंगे, इसलिए यह एक निर्माता है। उन वस्तुओं को Comparator पर विधि के तर्क के रूप में पारित किया जाएगा, इसलिए यह एक उपभोक्ता है।

0

तुलनित्र को T एक तर्क के रूप में लेने में सक्षम होना चाहिए।

+0

मुझे लगता है कि शायद मैं पूरी तरह समझ/समझने के सिद्धांत को समझ नहीं पा रहा हूं ... ??? –

+6

मैं प्रभावी जावा के अध्याय को पढ़ने की अनुशंसा करता हूं जो "पीईसीएस" पर चर्चा करता है। और इस बारे में सोचें: अगर मैंने आपको डबल्स की सूची सॉर्ट करने के लिए कहा है, और आपको इसे करने के लिए एक तुलनात्मक दिया है, तो आप इसके बारे में कैसा महसूस करेंगे? –

+0

क्या आप अपना उत्तर विस्तारित कर सकते हैं? जबकि उन्नत जावा प्रोग्रामर के लिए उत्तर स्पष्ट हो सकता है, लेकिन आप जो भी कह रहे हैं उसे पूरी तरह से समझने के लिए प्रश्न को फिर से पढ़ना आवश्यक है। मुझे पता है कि यह आपके पहले के उत्तरों में से एक हो सकता है, लेकिन यह निम्न गुणवत्ता वाले पोस्ट समीक्षा अनुभाग में दिखाई देता है। - [समीक्षा से] (https://stackoverflow.com/review/low-quality-posts/11445740) – Ferrybig

1

तुलनाकर्ता टीएस की एक जोड़ी का उपभोग करता है और एक int उत्पन्न करता है। संग्रह टीएस तुलनित्र उपभोग करता है।

सुपर उपभोग, उत्पादन बढ़ाता है।

प्राप्त करने और सिद्धांत के संबंध में, उत्पादन प्राप्त करें और उपभोग करें।

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