2012-08-30 3 views
5

इस कोड स्निपेटसंग्रह में एक प्रकार का उप-वर्ग क्यों जोड़ना अवैध है?

//Creates a list of List numbers 
    List<List<Number>> num = new ArrayList<List<Number>>(); 
    //Creates a list of List doubles 
    List<List<Double>> doub = new ArrayList<List<Double>>(); 
    //List of doubles 
    List<Double> d = new ArrayList<Double>(); 
    d.add(2.5); 
    d.add(2.6); 
    doub.add(d); 

    num.add(d);//This code will not compile 

क्यों कि num.add (शक) अनुमति नहीं दी जाएगी दिया? List<List<Number>> एक सुपर प्रकार का List<List<Double>> नहीं है?

+1

क्या आपका मतलब num.add (d) के बजाय num.add (d) था? – Alex

+0

जेनेरिक प्रकारों को सटीक होना चाहिए जबतक कि आपने अनुमति नहीं दी है? उप प्रकार या 'विस्तारित करता है? सुपर 'सुपर प्रकार। –

+0

मैंने कोड संपादित किया। उसका मतलब 'num.add (डी) 'था, अन्यथा सवाल दिलचस्प नहीं है! – romaintaz

उत्तर

6

Generics inheritance विरासत की हमारी समझ से थोड़ा अलग है। यदि आप सबक्लास प्रकारों का उपयोग करना चाहते हैं तो आपको जेनिक्स में विस्तार (या) सुपर का उपयोग करके सीमाओं (wildcards) को परिभाषित करने की आवश्यकता है।

enter image description here

+0

क्या आप मुझे मेरे उदाहरण के संबंध में एक उदाहरण प्रदान कर सकते हैं? – KyelJmD

+0

+1 मैंने आपके उत्तर में छवि को और स्पष्ट किया –

+0

तो क्या मैं ऐसा करूँगा? सूची <सूची ? – KyelJmD

1

आप एक सूची है कि एक सूची लेता है सूचियाँ की एक सूची जोड़ने की कोशिश कर रहे हैं। (संपादन के बाद नहीं मैं देख रहा हूँ)

या हो सकता है थोड़ा कम भ्रामक:

Your num list can only add List<Number>, you are trying to add a List<List<Double>>. 

इसके अलावा, जेनरिक के साथ विरासत कि जिस तरह से काम नहीं करता है, भले ही आप डबल्स की सूची जोड़ने था, ऐसा नहीं है काम।

आप इस तरह संख्या निर्धारित करते हैं:

num.add(d); 

लेकिन नहीं:

num.add(doub); 
0

List<Double> लेना देना नहीं है

List<List<? extends Number>> num = new ArrayList<List<? extends Number>>(); 

तो फिर तुम यह करने के लिए सक्षम हो जाएगा List<Number> के साथ जहां तक ​​कंपिलरके बारे में चिंतित हैभाग।

इसलिए List<List<Double>>List<List<Number>> से प्राप्त नहीं होता है वे जावा जेनरिक सिस्टम द्वारा दो पूरी तरह से अलग प्रकार हैं। कक्षाओं के निर्माण के दौरान यह extends संबंध नहीं है।

0

घोषित प्रकारों को देखते हुए, doub.add(d) और num.add(doub)add() का असंगत व्यवहार दर्शाता है। यदि doub.add(d) काम करता है, तो मुझे num.add(doub) की अपेक्षा भी नहीं होगी।

आप शायद

num.add(d) 

num.add(doub) 

के बजाय

परीक्षण करने के लिए मतलब है?

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