चलें कहते हैं कि हम एक कार्यक्रम है जो इस तरह की कक्षाओं में शामिल है:, सहीजावा संग्रह सहप्रसरण समस्या
public interface AbstractItem {
}
public SharpItem implements AbstractItem {
}
public BluntItem implements AbstractItem {
}
public interface AbstractToolbox {
//well the problem starts here...
public List<AbstractItem> getItems();
}
public ExpensiveToolbox implements AbstractToolbox {
private List<SharpItem> items = new ArrayList()<SharpItems>;
public List<SharpItem> getItems() { return this.items; }
}
public CheapTooblox implements AbstractToolbox {
private List<BluntItem> items = new ArrayList()<BluntItem>;
public List<BluntItem> getItems() { return this.items; }
}
आसान? खैर कहना अब हम इस तरह एक विधि बनाने के लिए (कुछ यादृच्छिक कक्षा में) चाहते हैं कर सकते हैं:
public void doImportantStuff(AbstractToolbox toolbox) {
//important stuff!
//this obviously won't work
List<AbstractToolbox> items = toolbox.getItems();
//do some stuffwith all items
}
अब समस्या यह है कि जावा में जेनरिक के साथ संग्रह (covariant नहीं कर रहे हैं कि इस शब्द का मैं तलाश कर रहा हूँ है आशा है) और मैं ArrayList<ExpensiveToolbox>
को List<AbstractToolbox>
पर असाइन नहीं कर सकता। एकमात्र समाधान जो मैं यहां देख सकता हूं वह है कोड को डुप्लिकेट करना और प्रत्येक प्रकार के लिए एक संस्करण करना, लेकिन यह स्पष्ट रूप से चूसना होगा (क्या होगा यदि हमारे पास अलग-अलग सूचियों के साथ सारटूलबॉक्स को लागू करने वाले अधिक वर्ग थे?)। ओह जाहिर है कि दूसरा समाधान जेनेरिक को छोड़ना और सामान्य सूची बनाना होगा, लेकिन क्या यह एक अच्छा अभ्यास है?
क्या ऐसी समस्याओं से निपटने के लिए कोई डिज़ाइन पैटर्न/प्रथाएं हैं?
@Edit: ठीक है तो मैं सटीक पर्याप्त नहीं हो सकता है। मैं सारणीटूल को विस्तारित करने वाले कुछ वर्गों की सूची रखने के लिए सार तत्वों को चाहता हूं जो सार तत्वों का विस्तार करते हैं और फिर मुझे एक विधि चाहिए जो पैरामीटर के रूप में एक सारूलूलबॉक्स ले लेगा और इसकी सूची में वस्तुओं पर कुछ करे (कक्षाओं का उपयोग करके परिभाषित किया जाएगा सार तत्व इसलिए सभी संभावित सूची के सभी आइटम वास्तव में उन्हें होंगे)।
स्पष्ट करने के लिए होगा आप अपने doImportantStuff करना चाहते हैं नहीं: सूची आइटम = toolbox.getIems(); –
MikeTheReader
आपका क्या मतलब है, "आसान, सही?" आपका पहला खंड संकलित नहीं करता है, और नहीं करना चाहिए! –
ठीक है मुझे लगा कि एसओ के लिए यह आसान होगा। मेरा मतलब है कि * मुझे * इसमें समस्याएं हैं;) –