2009-03-19 18 views
26

निम्नलिखित स्निपेट पर विचार करें:जावा में जेनेरिक का उपयोग करके मैं एक सूची कैसे डाल सकता हूं?

public interface MyInterface { 

    public int getId(); 
} 

public class MyPojo implements MyInterface { 

    private int id; 

    public MyPojo(int id) { 
     this.id = id; 
    } 

    public int getId() { 
     return id; 
    } 

} 

public ArrayList<MyInterface> getMyInterfaces() { 

    ArrayList<MyPojo> myPojos = new ArrayList<MyPojo>(0); 
    myPojos.add(new MyPojo(0)); 
    myPojos.add(new MyPojo(1)); 

    return (ArrayList<MyInterface>) myPojos; 
} 

वापसी कथन एक कास्टिंग कि संकलन नहीं करता है। सूची के प्रत्येक आइटम के माध्यम से बिना किसी सामान्य सूची, पर myPojos सूची को मैं कैसे परिवर्तित कर सकता हूं?

public ArrayList<? extends MyInterface> getMyInterfaces() {  
    ArrayList<MyPojo> myPojos = new ArrayList<MyPojo>(0); 
    myPojos.add(new MyPojo(0)); 
    myPojos.add(new MyPojo(1)); 

    return myPojos; 
} 

इस सूची में इंटरफ़ेस के अन्य कार्यान्वयन जोड़ने की कोशिश कर से फोन करने वाले पाएगा:

धन्यवाद

उत्तर

41
किसी वाइल्डकार्ड का उपयोग करने के लिए अपने विधि बदलें

। वैकल्पिक रूप से, आप बस लिख सकते हैं:

public ArrayList<MyInterface> getMyInterfaces() { 
    // Note the change here 
    ArrayList<MyInterface> myPojos = new ArrayList<MyInterface>(0); 
    myPojos.add(new MyPojo(0)); 
    myPojos.add(new MyPojo(1)); 

    return myPojos; 
} 

के रूप में टिप्पणी में चर्चा की:

  • में वाइल्डकार्ड संग्रह रिटर्निंग कॉल
  • यह वापसी के लिए ठोस प्रकार के बजाय इंटरफेस का उपयोग करने के आम तौर पर बेहतर है के लिए अजीब हो सकता है प्रकार के। तो सुझाव हस्ताक्षर शायद में से एक होगा:

    public List<MyInterface> getMyInterfaces() 
    public Collection<MyInterface> getMyInterfaces() 
    public Iterable<MyInterface> getMyInterfaces() 
    
+0

दूसरा समाधान बेहतर एक IMHO है। लौटने वाले जंगली कार्ड्स को आम तौर पर खराब अभ्यास माना जाता है, बी/सी यह क्लाइंट कोड को बाधित करता है। इस मामले में ArrayList आप केवल सूची से पढ़ सकते हैं, और इसमें कुछ भी नहीं जोड़ सका। –

+0

यह वही हो सकता है जो निश्चित रूप से चाहता था - हम बस नहीं जानते। अधिक सामान्य प्रकार (उदा सूची , संग्रह ) का उपयोग कर के लिए (यह लगभग निश्चित रूप के साथ-सूची बजाय ArrayList का उपयोग करना चाहिए, या संभवतः सिर्फ Iterable या संग्रह ।) –

+1

+1। लेकिन वाइल्डकार्ड लौटना शायद ही कभी आप चाहते हैं। यदि आप अपरिवर्तनीयता की ओर झुका रहे हैं तो ऐसा करने के बेहतर तरीके हैं। Naftalin और Wadler "जावा जेनरिक और संग्रह" में इसके बारे में बात करते हैं। –

4

आप करना चाहिए:

public ArrayList<MyInterface> getMyInterfaces() { 
    ArrayList<MyInterface> myPojos = new ArrayList<MyInterface>(0);  
    myPojos.add(new MyPojo(0));  
    myPojos.add(new MyPojo(1));  
    return myPojos; 
} 
0

इस मामले में, मैं इसे इस तरह करना होगा:

public ArrayList<MyInterface> getMyInterfaces() { 

    ArrayList<MyInterface> myPojos = new ArrayList<MyInterface>(0); 
    myPojos.add(new MyPojo(0)); 
    myPojos.add(new MyPojo(1)); 

    return myPojos; 
} 

MyPojo MyTterface टाइप करें (क्योंकि यह इंटरफ़ेस लागू करता है)। इसका मतलब है, आप केवल उस इंटरफ़ेस के साथ सूची बना सकते हैं जिसकी आपको आवश्यकता है।

0

प्रयास को छोड़कर हर जगह इंटरफेस का उपयोग करने के लिए जब उदाहरणों का निर्माण, और आप समस्याओं दूर जाना होगा:

public List<MyInterface> getMyInterfaces() 
{ 
    List<MyInterface> myInterfaces = new ArrayList<MyInterface>(0); 
    myInterfaces.add(new MyPojo(0)); 
    myInterfaces.add(new MyPojo(1)); 

    return myInterfaces; 
} 

के रूप में दूसरों को पहले से ही कहा है, MyInterface के उपयोग आपकी समस्या को ठीक करता है। रिटर्न प्रकारों और चर के लिए ArrayList के बजाय सूची इंटरफ़ेस का उपयोग करना बेहतर है।

+0

सूची का उपयोग यह नहीं है कि यद्यपि यह ठीक करता है - यह MyPojo के बजाय MyInterface का उपयोग प्रकार तर्क के रूप में है। –

+0

हां, वह भ्रामक था, अब इसे ठीक कर दिया। – starblue

24

शुरुआत से सही प्रकार का चयन करना सबसे अच्छा है, हालांकि आपके प्रश्न का उत्तर देने के लिए आप टाइप एरर का उपयोग कर सकते हैं।

return (ArrayList<MyInterface>) (ArrayList) myPojos;

+3

आईएमओ, यह जवाब होना चाहिए, क्योंकि कुछ मामलों में, आप बस मूल प्रकार के संग्रह में आइटम नहीं जोड़ सकते हैं: प्रश्नों से सेट जेपीए परिणाम के बारे में सोचें, आपको जेपीए इकाइयों की एक सूची मिली है और यदि आप चाहें इकाई (दृढ़ता अज्ञेयवादी) के ऊपर कुछ सारणित इंटरफ़ेस का उपयोग करके कॉलर को इस सूची को वापस करें, पीटर की सलाह * * रास्ता है –

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

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