2008-11-18 15 views
5

के संग्रह की आवश्यकता वाले किसी विधि के लिए उप प्रकार के संग्रह को पास करने के लिए जावा में यह कैसे करें - किसी प्रकार के उप-प्रकार का संग्रह पास करने के लिए बेस प्रकार का संग्रह आवश्यक है?जावा जेनरिक - बेस टाइप

उदाहरण नीचे देता है:

The method foo(Map<String,List>) is not applicable for the arguments (Map<String,MyList>) 

मैं टाइप किया संग्रह के लिए एक वर्ग पदानुक्रम बनाने के द्वारा लागू कर सकते हैं - लेकिन यह अन्यथा संभव है?

public void testStackOverflow() { 

    class MyList extends AbstractList { 
     public Object get(int index) { 
      return null; 
     } 
     public int size() { 
      return 0; 
     }   
    }; 

    Map <String, List> baseColl = null; 
    Map <String, MyList> subColl = null; 

    foo (subColl);    
} 

private void foo (Map <String, List> in) {  
} 

संपादित करें: जवाब से बाहर कर देता है कि इस की आवश्यकता है "घिरे वाइल्डकार्ड" इतना करने के लिए बदलें foo खोज योग्यता

के लिए इस पाठ जोड़ने

उत्तर

17

:

private void foo(Map <String, ? extends List> in) { 
} 

है कि आप के भीतर क्या कर सकते हैं को प्रतिबंधित करेगा foo, लेकिन यह उचित है। आप जानते हैं कि मानचित्र से प्राप्त कोई भी मूल्य एक सूची होगी, लेकिन आप नहीं जानते कि मानचित्र में किस प्रकार का मूल्य मान्य है।

+0

धन्यवाद! यह समाधान बिल्कुल है :-) – horace

2

जॉन रों कहते हैं:

private void foo (Map <String, ? extends List> in { ... } 

त्रुटियों को ठीक करेंगे। हालांकि आपको अभी भी चेतावनियां मिलेंगी। गेट-पुट सिद्धांत देखें: http://www.ibm.com/developerworks/java/library/j-jtp07018.html

+0

अच्छा लिंक - मैं बस के लिए Google शुरू कर रहा था? विस्तारित करता है :-) – horace

+0

जावा जेनरिक आसान नहीं है, "जावा जेनेरिक और संग्रह" (http://oreilly.com/catalog/9780596527754/) बहुत उपयोगी है। –

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