निम्नलिखित स्निपेट पर विचार करें:जावा में जेनेरिक का उपयोग करके मैं एक सूची कैसे डाल सकता हूं?
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;
}
इस सूची में इंटरफ़ेस के अन्य कार्यान्वयन जोड़ने की कोशिश कर से फोन करने वाले पाएगा:
धन्यवाद
दूसरा समाधान बेहतर एक IMHO है। लौटने वाले जंगली कार्ड्स को आम तौर पर खराब अभ्यास माना जाता है, बी/सी यह क्लाइंट कोड को बाधित करता है। इस मामले में ArrayList MyInterface को बढ़ाता है> आप केवल सूची से पढ़ सकते हैं, और इसमें कुछ भी नहीं जोड़ सका। –
यह वही हो सकता है जो निश्चित रूप से चाहता था - हम बस नहीं जानते। अधिक सामान्य प्रकार (उदा सूची, संग्रह ) का उपयोग कर के लिए (यह लगभग निश्चित रूप के साथ-सूची बजाय ArrayList का उपयोग करना चाहिए, या संभवतः सिर्फ Iterable या संग्रह ।) –
+1। लेकिन वाइल्डकार्ड लौटना शायद ही कभी आप चाहते हैं। यदि आप अपरिवर्तनीयता की ओर झुका रहे हैं तो ऐसा करने के बेहतर तरीके हैं। Naftalin और Wadler "जावा जेनरिक और संग्रह" में इसके बारे में बात करते हैं। –