java - Generic Types & the toArrayMethod -
मेरे पास एक वर्ग MyStack
सार्वजनिक टी [] toArray () {int s = आकार (); @SuppressWarnings ("अनचेक") टी [] परिणाम = (टी []) नई वस्तु [एस]; नोड n = पहले; के लिए (इंट आई = 0; आई & lt; s; i ++) {परिणाम [i] = n.data; एन = n.next; } वापसी परिणाम; }
चूंकि यह एक सरणी प्रकार T
देता है, मुझे लगता होगा कि अगर मैंने यह उदाहरण घोषित किया है: MyStack & lt; स्ट्रिंग & gt; S = नया माइस्टैक्स & lt; & gt;
, यह पूरी तरह से मान्य होगा: स्ट्रिंग [] test = s.toArray ()
। मुझे लगता है क्योंकि s
प्रकार स्ट्रिंग
, toArray
की वजह से स्ट्रिंग
की एक सरणी वापस करनी चाहिए, क्योंकि < कोड> स्ट्रिंग मूल रूप से इस वर्ग में प्रत्येक T
के लिए प्रतिस्थापित किया गया है (केवल इस विशेष तात्कालिकता के लिए, मुझे पता है)। यह बिना किसी त्रुटि के चलने का एकमात्र तरीका है यदि मैं ऐसा करता हूं: वस्तु [] परीक्षण = s.toArray ()
।
यह क्यों है?
ठीक है, एक मिनट रुको। मान लें कि आपकी परिकल्पना सही थी कि स्ट्रिंग
को प्रत्येक T
के लिए प्रतिस्थापित किया गया था।
क्या निम्न कास्ट मान्य होगा?
स्ट्रिंग [] परिणाम = (स्ट्रिंग []) नई वस्तु [एस];
नहीं, यह नहीं होगा हम यह सुनिश्चित कर सकते हैं कि एक नया ऑब्जेक्ट []
एक स्ट्रिंग []
नहीं है।
अब कभी-कभी आप जब क्लास संकलित हो जाता है, तो वास्तव में क्या होता है कि और कॉल को कॉल साइट पर ले जाया गया है: (टी []) नई वस्तु [एन] लेकिन यह केवल इसलिए काम करता है क्योंकि कलाकार वास्तव में सामान्य वर्ग के अंदर हो जाता है (यह एक भ्रामक मुहावर है।)
T
के संदर्भ में इसकी ऊपरी सीमा (शायद ऑब्जेक्ट जब तक आपके पास
& lt; T का विस्तार होता है ... & gt;
):
सार्वजनिक वस्तु [] toArray () {int s = size (); वस्तु [] परिणाम = नई वस्तु [एस]; नोड n = पहले; के लिए (इंट आई = 0; आई & lt; s; i ++) {परिणाम [i] = n.data; एन = n.next; } वापसी परिणाम; }
माइस्टैक स्टैक = नया माइस्टैक्स (); स्ट्रिंग [] arr = (स्ट्रिंग []) stack.toArray (); इसलिए वास्तव में, जब कलाकार को कक्षा में मिटा दिया जाता है, तो एक बार क्लास के बाहर मान वापस कर दिया जाता है, जहां
ClassCastException
फेंक दिया जाता है।
सरणियों (और सामान्य रूप में ऑब्जेक्ट) को इन्स्तांत करने में असमर्थता सामान्य तौर पर है कि संग्रह फ़्रेमवर्क एक तर्क के रूप में वापसी सरणी को लेने के लिए उनकी विधि को परिभाषित करता है। आपके लिए इसका एक सरल संस्करण निम्न की तरह होगा:
सार्वजनिक टी [] toArray (T [] inArray) {int s = size (); नोड n = पहले; के लिए (इंट आई = 0; आई & lt; s; i ++) {एआररे [आई] = एन डीएटीए; N = n.next; } वापसी में एरे; }
कैसे एक सरणी उत्पन्न करने के तरीके पर कुछ विचारों के लिए, आप देख सकते हैं; हालांकि आपको विधि से कुछ तर्क को पास करने के लिए कॉलर की आवश्यकता होगी।
Comments
Post a Comment