2013-04-11 7 views
5
public static void main(String[] args) throws Exception { 
    int[] a = new int[] { 1, 2, 3 }; 
    method(a); 
} 

public static void method(Object o) { 
    if (o != null && o.getClass().isArray()) { 
     Object[] a = (Object[]) o; 
     // java.lang.ClassCastException: [I cannot be cast to [Ljava.lang.Object; 
    } 
} 

मैं जानना चाहता method में पैरामीटर o के प्रकार क्या चाहिए नहीं कर रहा हूँ करने के लिए एक वस्तु कास्ट। फिर मैं इसे Object[] सरणी में कैसे डाल सकता हूं?एक सरणी

instanceof कोई समाधान नहीं हो सकता है क्योंकि पैरामीटर किसी भी प्रकार की सरणी हो सकता है।

पीएस: मैंने सर पर कास्टिंग के साथ एसओ पर कई प्रश्न देखे हैं, लेकिन कोई भी नहीं (अभी तक?) जहां आप सरणी के प्रकार को नहीं जानते हैं। ।

+0

क्या आप अपने प्रश्न के लिए थोड़ा और संदर्भ प्रदान करने में सक्षम हैं। इन वस्तुओं के साथ आप क्या करना चाहते हैं? –

उत्तर

6

आप अपने अज्ञात सरणी से एक विशिष्ट तत्व प्राप्त करने के लिए java.lang.reflect.Array.get() का उपयोग कर सकते हैं।

+2

+1 और 'Array.getLength()' इसकी लंबाई प्राप्त करने के लिए। –

+1

प्रतिबिंब के कारण यह बहुत धीरे-धीरे काम करेगा। लेकिन एक विचार के लिए +1 – Andremoniy

+1

टैग को देखते हुए, मुझे लगता है कि वह कुछ हद तक वह खोज रहा है – SGM1

3

विकल्प 1

उपयोग o.getClass() getComponentType() निर्धारित करने के लिए यह किस प्रकार का है:

if (o != null) { 
    Class ofArray = o.getClass().getComponentType(); // returns int 
} 

देखें Demo


विकल्प 2

if (o instanceof int[]) { 
    int[] a = (int[]) o;   
} 

* Noice: आप निर्धारित करने के लिए क्या सरणी की तरह जब जरूरत इसे करने के लिए यह और कलाकारों है किसी भी प्रकार int के अलावा अन्य उपयोग कर सकते हैं।

+0

+1 'ओ! = नल' अनावश्यक है –

+0

@ पीटर लेवर धन्यवाद, इसे ठीक करें। – CloudyMarble

+0

आईएमएचओ यह सबसे अच्छा जवाब है, यह सवाल है जो गलत तरीके से मानता है कि इसे 'ऑब्जेक्ट [] ' –

4

आप इस ऑब्जेक्ट को Object[] कक्षा पर नहीं डाल सकते हैं, क्योंकि वास्तव में यह int -s की एक सरणी है। इसलिए, यह सही हो सकता है अगर आप लिखते हैं:

public static void method(Object o) { 
    if (o instanceof int[]) { 
     int[] a = (int[]) o; 
     // .... 
    } 
} 
+0

मुझे तब आदिम प्रकारों से बाहर निकलने के रूप में कई 'if' लिखना चाहिए? – sp00m

+1

@ sp00m, हाँ, आपको चाहिए। और यह कुछ गलत नहीं है। 'Java.util.Arays' वर्ग को देखें और आप देखेंगे कि यह आदिम प्रकारों के लिए एक आम पैटर्न है। उदाहरण के लिए, 'java.util.Arrays' वर्ग' की विधि 'हैशकोड' देखें। – Andremoniy

+1

यह (और अन्य समान उत्तरों) मेरे लिए सबसे अच्छा लग रहा है। हालांकि 'if' कथन के साथ एक विधि को पैक करने के लिए * गलत * लगता है, लेकिन यदि आपको अपने ऑब्जेक्ट के रूप में' ऑब्जेक्ट 'लेना आवश्यक है तो यह वास्तव में जरूरी है। –

5

आप Object रों की एक सरणी के लिए पुरातन की एक सरणी (आपके मामले में int रों) डाली नहीं कर सकता। यदि आप बदलने के लिए:

int[] a = new int[] { 1, 2, 3 }; 

Integer[] a = new Integer[] { 1, 2, 3 }; 

के लिए यह काम करना चाहिए।

+1

यदि आप कभी भी प्राइमेटिव नहीं देते हैं तो आप हमेशा 'ऑब्जेक्ट' पर जा सकते हैं और आपकी समस्या हल हो जाएगी – iberbeu

+0

यह सरणी में ऑब्जेक्ट रैपर का गलत उपयोग है। ऐसा करने से आप स्मृति पर ओवरहेड उत्पन्न करते हैं। – Andremoniy