2013-03-21 6 views
6

मैंने हाल ही में जावा पर एक परीक्षा की थी, और जावा में वाइल्डकार्ड जेनरिक के बारे में एक विस्तृत अनुभाग था। हालांकि, अभ्यास में उनके उपयोग के बारे में बहुत कम कहा जाता है। हमें उनका उपयोग कब करना चाहिए? चलो विशिष्ट उपयोग देखें:जावा में वाइल्डकार्ड जेनरिक का व्यावहारिक उपयोग

void check(Collection<? extends Animal> list) { 
    // Do something 
} 

क्या प्रलेखन कहते हैं, कि इस संग्रह की सूची पर किसी भी तत्व को जोड़ने के लिए अनुमति नहीं है। इसलिए मूल रूप से वाइल्डकार्ड का उपयोग केवल संग्रह को पढ़ने के लिए किया जा सकता है। क्या यह उनका एकमात्र उपयोग है? क्या इसके लिए कोई व्यावहारिक आवश्यकता है? पिछले चार सालों से मैंने जावा में कई प्रोग्रामिंग परियोजनाओं में हिस्सा लिया है, लेकिन मैंने ऐसी कोई परियोजना नहीं देखी है जो व्यापक रूप से वाइल्डकार्ड जैसी सुविधा का उपयोग करेगी।

तो, व्यावहारिक दृष्टिकोण से, क्या ऐसी कोई स्थितियां हैं जब वाइल्डकार्ड जेनेरिक अपरिहार्य और आवश्यक हैं?

+0

विरोधाभासी जवाब के आधार पर, आपके सवाल का बहुत अच्छा है। :-) –

उत्तर

3

तो, व्यावहारिक दृष्टिकोण से, क्या कोई स्थिति है जब वाइल्डकार्ड जेनेरिक अपरिहार्य और आवश्यक हैं?

मुझे नहीं लगता कि वे 'अपरिहार्य और आवश्यक' हैं क्योंकि जावा कंपाइलर उन्हें वैसे भी मिटा देता है। हालांकि, उनका उपयोग करते समय आपको संकलन-समय के दौरान एक कठिन प्रकार की जांच का लाभ मिलता है और आप प्रकार कास्टिंग से बचते हैं। वैसे भी किस प्रकार कास्ट करना चाहते हैं?:)

Guidelines for Wildcard Use

Type Erasure

+0

धन्यवाद, मैं इस दिशानिर्देश को याद किया, यह वाइल्डर्ड उपयोग के लिए मूल नियम बताता है –

1
void check(Collection<? extends Animal> list) { 
    list.add(new Animal()); // compile time error 
    list.add(new Dog()); // compile time error. Dog is subclass of Animal class. 
} 

जावा क्योंकि कोड के लिए प्रोग्रामिंग वे अन्यथा चाहते जो कुछ भी यह तो बाद में वे रन-टाइम वातावरण में एक गड़बड़ मिलेगा अनुमति दी है अगर अस्वीकृत करने के लिए इस तरह के जेनरिक का विकास है।

प्रोग्रामिंग में कभी-कभी आपको एक परिदृश्य मिलेगा जहां आपकी विधि check सूची में तत्व जोड़ने की इच्छा नहीं रखती है लेकिन उन तत्वों को पढ़ना चाहती है।

आप केवल null मान जोड़ सकते हैं।

+0

आप सही हैं, लेकिन कृपया, एक दस्तावेज़ उद्धरण। यह अजीब लगता है –

0

संक्षेप में, आप जो कह रहे हैं वह गलत है।

इसका "संग्रह केवल पढ़ने के लिए" करने के लिए कुछ भी नहीं है।

हम अभी भी इनपुट सूची में तत्व जोड़ सकते हैं, क्योंकि संग्रह ने add(E) विधि घोषित की है।

वाइल्डकार्ड सीधे आगे है मुझे लगता है: आप वास्तव में इनपुट प्रकार को बाधित करना चाहते हैं, क्योंकि आपका तर्क केवल कुछ प्रकार के लिए उचित है।

अपने उदाहरण के लिए, आपका चेक शायद पशु

void check(Collection<? extends Animal> list) { 
    // Do something 
    for (Animal a : list) { 
    a.checkAge(); // checkAge() is method of Animal 
    } 
} 

के कुछ विधि का उपयोग कर ? extends Animal के बिना, ऊपर कोड काम नहीं करेगा, के रूप में भेजे सूची कुछ भी नहीं है (पशु) का संग्रह हो सकता है।

इसलिए, हम संग्रह या संग्रह आदि में आने वाले संग्रह को सुनिश्चित करना चाहते हैं, ताकि हमारा कोड वास्तव में समझ में आ सके क्योंकि हम सूची से तत्वों को पुनर्प्राप्त कर रहे हैं और तत्व को पशु के रूप में मानते हैं।

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