2009-05-27 10 views
36

मेरे पास जेनेरिक के बारे में जावा प्रश्न है। मैं एक सामान्य सूची घोषित: फिरसूची <? MyType बढ़ाता है>

List<? extends MyType> listOfMyType; 

कुछ विधि मैं का दृष्टांत और उस सूची में आइटम जोड़ कोशिश में:

listOfMyType = new ArrayList<MyType>(); 
listOfMyType.add(myTypeInstance); 

कहाँ myTypeInstance बस प्रकार MyType का एक उद्देश्य है, यह संकलित नहीं होगा। इसे कहते हैं:

विधि जोड़ने में प्रकार सूची < कब्जा # 3-की (? कब्जा # 3-की MyType फैली)? MyType बढ़ाता है> तर्कों के लिए लागू नहीं है (MyType)

कोई विचार?

उत्तर

29

आप विस्तार के साथ "डाल" नहीं कर सकते हैं। Generics - Get and Put rule देखें।

+9

जोश बलोच कहते हैं: "पी ई सी एस याद रखें: निर्माता का विस्तार, उपभोक्ता सुपर।" चूंकि listOfMyType एक उपभोक्ता है (आप इसमें जोड़ रहे हैं), 'सुपर' मान्य है और' विस्तारित 'नहीं है। –

+0

लिंक अब टूटा हुआ है। –

+0

पैडेंट्री का प्वाइंट: आप विस्तार के साथ ''null'' डाल सकते हैं।इसके अलावा आप उस प्रकार और "डाल" संदर्भों को कैप्चर कर सकते हैं जिन्हें आपने पिछले "मिल गया" है। –

4

आप अपने मामले में वाइल्डकार्ड कब्जा सिंटैक्स का उपयोग करने के लिए, बस

List<MyType> listOfMytype; 

घोषित करने के लिए पर्याप्त होना चाहिए की जरूरत नहीं होनी चाहिए। यदि आप जानना चाहते हैं कि क्यों, Java Generics Tutorial आप जावा जेनरिक की गूढ़ पागलपन के बारे में कभी भी जानना चाहते हैं। पृष्ठ 20 आपके विशिष्ट मामले को संबोधित करता है।

क्यों वाइल्डकार्ड कैप्चर के साथ जोड़ना काम नहीं करता है, ऐसा इसलिए है क्योंकि संकलक यह निर्धारित नहीं कर सकता कि माईटाइप का सबक्लास प्रत्येक मामले में होगा, इसलिए संकलक एक त्रुटि को छोड़ देता है।

22

पर विचार करें:

class MySubType extends MyType { 
} 

List<MySubType> subtypeList = new ArrayList<MySubType>(); 
List<? extends MyType> list = subtypeList; 
list.add(new MyType()); 
MySubType sub = subtypeList.get(0); 

sub अब एक MyType जो बहुत गलत है शामिल हैं।

+0

"list.get (0) नहीं होना चाहिए;" वास्तव में "subtypeList.get (0) हो;" ? – Zds

+0

@Zds Yup, सही किया गया। धन्यवाद। –

2

यहाँ एक ऐसी ही धागा है: How can elements be added to a wildcard generic collection?

कैसे जेनरिक काम करता है इस उदाहरण की जाँच का एक विचार प्राप्त करने के लिए:

List<SubFoo> sfoo = new ArrayList<SubFoo>(); 
    List<Foo> foo; 
    List<? extends Foo> tmp; 

    tmp = sfoo; 
    foo = (List<Foo>) tmp; 

बात है, कि स्थानीय/सदस्य के लिए नहीं बनाया गया था है चर, लेकिन फ़ंक्शन हस्ताक्षर के लिए, यही कारण है कि यह बहुत पिछड़ा है।

2

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

public <T> List<T> findAll(String tableName,Class<?> table) { 
    String sql = "SELECT * FROM "+ tableName ; 
    List<?> entities = getSimpleJdbcTemplate().query(sql, 
      ParameterizedBeanPropertyRowMapper.newInstance(table)); 
      return (List<T>) entities; 
} 

लगता parametrization जरूरतों आप का उपयोग करने के लिए? परिणामों को प्राप्त करने के लिए सूची में साइन इन करें और फिर सूची को अपेक्षित रिटर्न प्रकार पर डालें।

Iam अभी भी जेनरिक से चकाचौंध ...

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

  • कोई संबंधित समस्या नहीं^_^