/ / जावा में सबटाइपिंग या जेनरिक? - जावा, जेनेरिक, सबटिपिंग

जावा में सबटाइपिंग या जेनेरिक? - जावा, जेनेरिक, सबटाइपिंग

यह एक जावा असाइनमेंट प्रश्न है, संभवतः उप-टाइपिंग और जेनरिक से संबंधित है। मेरा एक वर्ग है जो विस्तार करता है ArrayList पंक्तियाँ कहा जाता है

public class Rows extends ArrayList<List<Thing>> implements List<List<Thing>>{}

मुझे इसे दूसरी कक्षा में वापस करने की आवश्यकता है जिसमें एक विधि है जो एक रिटर्न देता है List<List<Thing>>, इस प्रकार मुझे वांछित रिटर्न प्रकार पाने के लिए ऐसा करने की आवश्यकता है

private List<List<Thing>> list;

public List<List<Thing>> rows() {
Rows r = (Rows) list;// But this cast does not work at runtime
return (List<List<Thing>>) r;
}

ग्रहण का रिटर्न त्रुटि है java.lang.ClassCastException: java.util.ArrayList पैकेज के लिए नहीं डाला जा सकता। मैं काफी उलझन में हूं क्योंकि मेरी रॉस क्लास फैली हुई है ArrayList और मुझे लगा कि इसे कास्ट करने में सक्षम होना चाहिए।

उत्तर:

उत्तर № 1 के लिए 1
Rows extends ArrayList<List<Thing>>

उपरोक्त परिभाषा कहती है कि Rows एक है उपवर्ग का ArrayList<List<Thing>> (जिसका अर्थ है कि यह एक विशेष संस्करण है), नहीं उस Rows के रूप में एक ही बात है ArrayList<List<Thing>>.

इसका मतलब है कि ए Rows एक तरह का है ArrayList<List<Thing>> (इतना काम करता है) लेकिन एक ArrayList<List<Thing>> जरूरी नहीं है कि ए Rows (इसलिए डाउनकास्टिंग "टी काम")।

यदि आपके पास एक ऑब्जेक्ट है जिसे आपने "ए के रूप में बनाया है new ArrayList<List<Thing>>, तो यह इसका प्रकार है और आप इसे और नीचे "t" कर सकते हैं Rows, आपको बस इसे एक के रूप में बनाने की आवश्यकता है new Rows.

(वैसे, बहुवचन वर्ग नामों के लिए अपरंपरागत है।)