2013-06-14 17 views
6

एक सामान्य ढेर के कार्यान्वयन में में एक संदर्भ प्रकार सरणी के लिए, निम्न मुहावरा इस्तेमाल किया और किसी भी समस्या केकास्टिंग वस्तु [] जावा

public class GenericStack<Item> { 
    private int N; 
    private Item[] data;  

    public GenericStack(int sz) { 
     super(); 
     data = (Item[]) new Object[sz]; 

    } 
     ... 
} 

हालांकि जब मैं निम्नलिखित की कोशिश, यह एक ClassCastException का कारण बनता है के बिना काम करता है

String[] stra = (String[]) new Object[4]; 

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String; 

आप इसे कैसे समझाते हैं?

+0

स्ट्रिंग आइटम से प्राप्त नहीं होता है, इस प्रकार कास्ट संभव नहीं है। – Piovezan

+1

@Piovezan 'स्ट्रिंग' और' आइटम' एक ही पंक्ति में नहीं हैं। – Dukeling

+0

'नया जेनेरिकस्टैक (10)' काम करता है लेकिन यदि आप 'स्ट्रिंग [] स्ट्रै = नया जेनेरिकस्टैक (10) आज़माते हैं।GetData(); '(संबंधित गेटटर को लागू करें), यह क्लासकास्ट अपवाद के साथ विफल रहता है। तो यह "वास्तव में" काम नहीं करता है, कास्ट जादुई तरीके से नहीं किया गया है। –

उत्तर

3

एक एक String[] को new Object[4] कास्टिंग काम नहीं करता है क्योंकि एक Object[] एक String[] नहीं है, जैसे एक Object एक String नहीं है।

पहला उदाहरण type erasure के कारण काम करता है। रनटाइम पर, प्रकार पैरामीटर Item को Object पर मिटा दिया गया है। हालांकि यह इसी तरह, विफल हो जाएगा उदाहरण के लिए यदि आप एक reifiable प्रकार के सरणी आवंटित करने के लिए करने की कोशिश की है, तो dataprivate नहीं था:

String[] strings = new GenericStack<String>(42).data; 

यह इसी तरह, एक ClassCastException फेंक क्या वास्तव में एक Object[] को ढाले गए होते थे इसलिए है क्योंकि String[]

0

मुझे लगता है कि यह इस सवाल का सबसे अच्छा जवाब है:

"। एक String [] एक वस्तु [] है, जो एक छोटे से है जवाबी सहज ज्ञान युक्त आप का सामना कर रहे नहीं है" केले है-एक फल "लेकिन" केले की सूची फल की सूची नहीं है "परिदृश्य।"

रेफरी: https://stackoverflow.com/a/1018774/847818

वही सवाल से

, कैसे कास्ट करने के लिए:

String[] stringArray = Arrays.copyOf(objectArray, objectArray.length, String[].class); 

या

String[] stringArray = Arrays.asList(objectArray).toArray(new String[objectArray.length]); 
+2

यहां सही कार्यवाही शायद "[संभावित डुप्लिकेट] (http: // stackoverflow) जैसे कुछ कहने पर एक टिप्पणी हो सकती है। com/प्रश्न/1018750/कैसे करने वाली परिवर्तित वस्तु सरणी-से-स्ट्रिंग सरणी में जावा) "। – Dukeling

+0

संभावित रूप से, लेकिन व्यक्तिगत रूप से अगर उत्तर वास्तव में वही नहीं है तो मैं ओपी से प्रतिक्रिया के लिए इंतजार करूंगा। शायद वह कुछ और अलग मांगेगा। :) – Enrichman

+0

धन्यवाद @ लिंक के लिए एरिक्रिमैन, मुझे जेडरिक स्टैक कोड सेडगेविक की आल्गो बुक से मिला .. आपके लिंक ने मुझे बेहतर समझने में मदद की – damon

2

वजह से जेनरिक प्रकार विलोपन मद सरणी वस्तु सरणी effectivelly हो जाता है। इसलिए मैचों टाइप करें। लेकिन जब आप कंक्रीट प्रकार स्ट्रिंग के साथ ऐसा करते हैं तो यह नहीं होता है। कोई टाइप एरर लागू नहीं किया गया है और यह विफल रहता है।

1

मुझे लगता है कि यदि ऑब्जेक्ट क्लास रेफरेंस स्ट्रिंग क्लास या किसी अन्य क्लास जैसे किसी भी क्लास क्लास ऑब्जेक्ट को इंगित कर रहा है तो केवल हम उस विशेष वर्ग के ऑब्जेक्ट क्लास संदर्भ को कास्ट कर सकते हैं (जिस ऑब्जेक्ट को हमने ऑब्जेक्ट क्लास रेफरी बनाया है और असाइन किया है) और इसके लिए एक संदर्भ असाइन करें। और यदि हम ऑब्जेक्ट क्लास का प्रत्यक्ष ऑब्जेक्ट बनाते हैं (जैसा आपने बताया है) काम नहीं करेगा।

उदाहरण:

Object[] obj = new String[4]; 
String[] stra = (String[]) obj; 

कोड के ऊपर किसी भी ClassCastException उत्पन्न नहीं करेगा।

आशा इस मदद करता है

संबंधित मुद्दे