2013-01-09 18 views
19

मैं जेनेरिक के बारे में पढ़ रहा था और मुझे अनबाउंड वाइल्डकार्ड की आवश्यकता और कच्चे प्रकार से अलग कैसे समझ में नहीं आया। मैंने this question पढ़ा लेकिन अभी भी इसे स्पष्ट रूप से नहीं मिला। Java tutorial page for unbound wildcard में मैं दो अंक नीचे मिला है और मैं समझ गया नहीं था पहले बिंदु:एक अनबाउंड वाइल्डकार्ड और कच्चे प्रकार के बीच अंतर

  • आप एक विधि है कि Object कक्षा में प्रदान की कार्यक्षमता का उपयोग कर कार्यान्वित किया जा सकता लिख ​​रहे हैं।
  • जब कोड सामान्य वर्ग में विधियों का उपयोग कर रहा है जो प्रकार पैरामीटर पर निर्भर नहीं है। उदाहरण के लिए, List.size() या List.clear()। वास्तव में, Class<?> का उपयोग अक्सर किया जाता है क्योंकि Class<T> में अधिकांश विधियां T पर निर्भर नहीं होती हैं।

किसी अनबाउंड वाइल्डकार्ड और आम आदमी की भाषा में कच्चे प्रकार के बीच अंतर के बारे में समझाएं कर सकते हैं।

List<?>List<Object> से भिन्न कैसे है?

+1

नोट है कि शब्द "कच्चे प्रकार" एक सामान्य प्रकार, उदाहरण के लिए के लिए एक unparameterized संदर्भ को संदर्भित करता है 'सूची' बनाम 'सूची '। थोड़ा अलग अवधारणाओं। – Alex

+4

बस यह इंगित करने के लिए कि 'सूची ' कच्चा प्रकार नहीं है, इसका सामान्य प्रकार 'ऑब्जेक्ट' है। एक कच्चा प्रकार 'सूची' होगा। – Dmitri

उत्तर

33

कैसे List<?> से List<Object>

मुख्य अंतर यह अलग है कि पहली पंक्ति संकलित लेकिन दूसरे नहीं है:

List<?> list = new ArrayList<String>(); 
List<Object> list = new ArrayList<String>(); 

हालांकि, क्योंकि आप नहीं जानते कि क्या सामान्य List<?> का प्रकार है, आप इसकी पैरामीटरयुक्त विधियों का उपयोग नहीं कर सकते:

List<?> list = new ArrayList<String>(); 
list.add("aString"); //does not compile - we don't know it is a List<String> 
list.clear(); //this is fine, does not depend on the generic parameter type 

कच्चे प्रकार (कोई जेनरिक), compiles नीचे कोड और के साथ अंतर के रूप में ठीक चलाता है:

List list = new ArrayList<String>(); 
list.add("aString"); 
list.add(10); 
+0

इसे अभी तक मिला है लेकिन अनबाउंड के लिए कितना कच्चा प्रकार अलग है और हमें अनबॉड वाइल्डकार्ड की आवश्यकता क्यों है? क्या आप इसे कुछ अच्छे उदाहरण के साथ समझा सकते हैं। –

+0

@ सैंडी मुख्य अंतर आईएमओ यह है कि अनबाउंड वाइल्डकार्ड (उदाहरण के लिए एक विधि हस्ताक्षर में) का उपयोग यह संकेत देता है कि प्रश्न में विधि जेनेरिकों से अवगत है और उस वस्तु के सामान्य प्रकार का सम्मान करेगी। कच्चे प्रकार के साथ सभी दांव बंद हैं - आप स्ट्रिंग्स की एक सूची में एक संख्या जोड़ सकते हैं, जैसा कि यहां दिखाया गया है - और जेनेरिक और कच्चे कोड को मिलाकर क्लासकास्ट अपवादों का जोखिम हो सकता है। – Alex

+0

@ सैंडी मैंने unbouded (दूसरा उदाहरण) और कच्चे प्रकार (2 वें उदाहरण) के बीच का अंतर दिखाया। उनके बारे में क्या स्पष्ट नहीं है? – assylias

4

कैसे List<?>List<Object> से अलग है?

List<Object> l1 = new ArrayList(); 
    List<?> l2 = new ArrayList(); 
    l1.add("Object"); 
    //l2.add("Object"); incorrect 
    l2.add(null); 

आप केवल List<?>

2

व्यक्तिगत रूप से करने के लिए अशक्त-मूल्य जोड़ सकते हैं, मैं इस additional link from the Java tutorial on wildcards उपयोगी पाया।

मुख्य अंतर मैं List<?> और List के बीच देखने की है कि पूर्व ही कभी यह तत्वों से पढ़ने के लिए उपयोगी हो सकता है (जब तक आप वास्तव में null जोड़ना चाहते हैं) है, बाद की अनुमति देता है (अनियंत्रित) मनमाने ढंग से टाइप किया वस्तुओं के जोड़ने संभवतः अप्रत्याशित दुष्प्रभावों के साथ।

0

सूची उन विधियों को कॉल करने के लिए एक विधि हस्ताक्षर में उपयोगी है, जिन्हें टाइप पैरामीटर की आवश्यकता नहीं है, यानी, सूची से पढ़ें या उदाहरण के लिए इसे घुमाएं।

void someMethod(List<?> list) { 
    list.clear(); // I will never add anything to the list in here 
} 

आप कुछ भी जोड़ने कभी नहीं होगा या अन्यथा प्रकार आप इस हस्ताक्षर के साथ तरीकों में अशक्त को छोड़कर इस सूची के लिए कुछ भी नहीं जोड़ सकते हैं के रूप में है और इस तरह आप कभी भी प्रकार सुरक्षा को तोड़ने नहीं होगा यह धारण के संबंध में सूची को संशोधित। दूसरी तरफ कच्ची सूची आप कुछ भी कर सकते हैं, जैसा कि हम सभी जानते हैं, परिणामस्वरूप एक प्रकार का उल्लंघन उल्लंघन हो सकता है।

void someMethod2(List list) { 
list.add(new WeaselFurBrush()); 
} 
List list1 = new ArrayList<String>(); 
someMethod2(list1);// oops