2013-08-20 4 views
13

का बिंदु क्या है मैं प्रभावी जावा पढ़ रहा हूं और मैं असंबद्ध संग्रह प्रकार <?> पर आया हूं। हालांकि, पठन ने मुझे विश्वास दिलाया है कि Collection<?> के उदाहरण में null के अलावा, आप कोई भी तत्व नहीं डाल सकते हैं।संग्रह <?>

तो, मेरा प्रश्न यह है: Collection<?> को तत्काल करने का उद्देश्य क्या है जब हम केवल null तत्वों को डालने के कारण बता सकते हैं। मैं इस अवधारणा को समझने की कोशिश कर रहा हूं, लेकिन ऐसा लगता है कि यह बहुत समझ में नहीं आता है। कोई भी सहायताकाफी प्रशंसनीय होगी।

+0

मैंने सोचा कि प्रभावी जावा कहता है कि संग्रह टाइप सुरक्षित है। – blackpanther

+0

http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html – LaurentG

उत्तर

24

Collection<?> आपको अन्य चीजों के साथ, किसी भी प्रकार के Collection को किसी तर्क के रूप में स्वीकार करने की अनुमति देता है।

Set<String> strings = loadStrings(); 
collectionContains(strings, "pizza"); 

Collection<Integer> ints = Arrays.toList(1, 2, 3, 4, 5); 
collectionContains(ints, 1337); 

List<Collection<?>> collections = new ArrayList<>(); 
collectionContains(collections, ILLEGAL_COLLECTION); 
:

public boolean collectionContains(Collection<?> collection, Object toCompareTo) { 
    for (Object o : collection) { 
     if (toCompareTo.equals(o)) return true; 
    } 
    return false; 
} 

इस विधि Collection के किसी भी प्रकार के आधार पर कहा जा सकता है: उदाहरण के लिए, यदि आप एक विधि है कि true लौटाता है यदि एक Collection में किसी भी तत्व को कुछ मूल्य के बराबर हैं, तो आप कुछ इस तरह कर सकता है

+0

आप कार्यों के बजाय विधियों का मतलब है। – blackpanther

+1

Derp, हाँ, मेरा बुरा। – Smallhacker

5

पर विचार करें निम्नलिखित util विधि from docs

निम्न विधि कैसे एक मनमाना संग्रह फिल्टर करने के लिए एक इटरेटर उपयोग करने के लिए आपको दिखाता है - यानी, विशिष्ट तत्वों को हटाने के संग्रह को पार करें।

static void filter(Collection<?> c) { 
    for (Iterator<?> it = c.iterator(); it.hasNext();) 
     if (!cond(it.next())) 
      it.remove(); 
} 

कोड के इस सरल टुकड़ा जिसका अर्थ है कि यह कार्यान्वयन की परवाह किए बिना किसी भी Collection के लिए काम करता बहुरूपी है।

1

जब आप वाइल्डकार्ड के साथ संग्रह घोषित कर रहे हैं तो आप निर्दिष्ट करते हैं कि संग्रह सभी प्रकार के संग्रहों का एक सुपरटेप है।

void printCollection(Collection<?> c) { 
    for (Object e : c) { 
     System.out.println(e); 
    } 
} 

के रूप में यह बहुत विस्तृत है वाइल्ड कार्ड के बारे में Oracle's documentation पर एक नज़र डालें: यदि आप एक विधि है जिस पर आप के उदाहरण के लिए मान लीजिए संग्रह के सभी प्रकार के पारित करने के लिए चाहते हो जाएगा जब

यह वास्तव में उपयोगी है।

1

Collection सभी Lists और Sets का सबसे कम अमूर्त है। सबसे कम अमूर्तता के रूप में उपयोग करना अच्छा होता है, क्यूज यह आपको भविष्य में अधिक लचीलापन देता है और आपका कोड अधिक मजबूत है, cuz यह सभी Lists या Sets या अन्य कार्यान्वयन को संभाल सकता है, जिसे अभी तक लागू नहीं किया जाना है।

खैर, संग्रह Collection<Object> के बराबर कुछ तरीका है। इसका मतलब यह है कि Collection में संग्रहीत वस्तुओं का सामान्य प्रकार अज्ञात है या आप Object स्वयं किसी भी ऑब्जेक्ट के निम्नतम अमूर्तता का उपयोग कर सकते हैं। इस मामले में आप Collection में डाल सकते हैं किसी ऑब्जेक्ट को इसे विभिन्न प्रकारों से भी मिलाएं। लेकिन आपको इसे रनटाइम पर उचित प्रकार में डालने के बारे में पता होना चाहिए क्योंकि आपने यह नहीं प्रदान किया कि आपका संग्रह किस प्रकार का ऑब्जेक्ट संग्रहीत कर रहा है। इसलिए, संग्रह ऑब्जेक्ट को आपके लिए उचित प्रकार में नहीं डाला जा सकता है, आपको इसे स्वयं करना है। उचित प्रकार को पहचानने के लिए आपको रनटाइम पर Object instanceof SomeOtherClass या Class.isAssignableFrom(Class) का उपयोग करना चाहिए।

Collectionget() विधि लागू नहीं करता है लेकिन आप Iterator प्राप्त कर सकते हैं और इस तरह से संग्रह से ऑब्जेक्ट प्राप्त कर सकते हैं।

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