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

Popular posts from this blog

apache - 504 Gateway Time-out The server didn't respond in time. How to fix it? -

c# - .net WebSocket: CloseOutputAsync vs CloseAsync -

c++ - How to properly scale qgroupbox title with stylesheet for high resolution display? -