2011-10-26 4 views
5

बर्ताव करता है यहां प्रत्यक्ष होना करने के लिए एक उदाहरण है:जावा जेनेरिक्स: ArrayList (असीम वाइल्डकार्ड प्रकार) पर, जोड़ सकते हैं और addAll तरीकों को अलग ढंग से

ArrayList <?> x = new ArrayList(); 
    ArrayList y = new ArrayList(); 
    x.add("abc"); // Clause 1. Compilation error - No problemo. Understood. 
    x.addAll(y); // Clause 2. No compilation error 

असीम वाइल्डकार्ड के लिए, एक नहीं जोड़ सकते। अंतिम वक्तव्य पर कोई संकलन त्रुटि क्यों नहीं है?

उत्तर

7

क्योंकि आप कच्चे प्रकार के साथ विधि का आह्वान कर रहे हैं। कंपाइलर टाइप चेक नहीं कर सकता है। यदि आप y उपयोगकर्ता जेनेरिक बनाते हैं, तो addAll(..) विफल हो जाएगा।

+1

ठीक है। मैं अर्थ देखता हूँ। क्लॉज 1 असफल हो जाएगा - चूंकि प्रकार ज्ञात है और यह सामान्य नियम का पालन करता है जहां असंबद्ध वाइल्डकार्ड अतिरिक्त रोकता है। खंड 2, चूंकि प्रकार तत्व अज्ञात है, यह मिश्रण विरासत और जेनेरिक कोड के सामान्य नियम का उपयोग करता है। क्या इसे मैंने ठीक तरह से लिया? – yapkm01

+0

हाँ - कच्चे प्रकार के मामले में, सभी जेनेरिक सामान को त्याग दिया जाता है। – Bozho

+0

@ yapkm01 जेनेरिक जहां भाषा में देर से जोड़ा गया था, इसलिए उन्हें ऐसे तरीके से डिजाइन किया जाना था जो मौजूदा गैर जेनेरिक पुस्तकालयों की बड़ी संख्या के साथ आसान बातचीत की अनुमति दे, जिसके परिणामस्वरूप संकलक कच्चे प्रकार की उपस्थिति में जेनरिक को अनदेखा करता है। – josefx

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