2010-06-30 10 views
11

मैं एक उत्तीर्ण सूची लेना चाहता हूं जो मुझे पता है कि सजातीय है और इससे इसके भीतर तत्वों के समान प्रकार की सरणी बनाते हैं।जावा: किसी ऑब्जेक्ट के प्रकार के आधार पर मैं गतिशील रूप से निर्दिष्ट प्रकार की सरणी कैसे बना सकता हूं?

कुछ की तरह ...

List<Object> lst = new ArrayList<Object>; 

lst.add(new Integer(3)); 

/// somewhere else ... 

assert(my_array instanceof Integer[]); 

उत्तर

13

रूपांतरण रनटाइम होगा, जबकि संकलन समय पर प्रकार खो गया है। तो अगर आप की तरह कुछ करना चाहिए:

public <T> T[] toArray(List<T> list) { 
    Class clazz = list.get(0).getClass(); // check for size and null before 
    T[] array = (T[]) java.lang.reflect.Array.newInstance(clazz, list.size()); 
    return list.toArray(array); 
} 

लेकिन सावधान रहना है कि 3 रेखा से ऊपर एक अपवाद फेंक कर सकते हैं - यह typesafe नहीं है।

+2

+1: यह तब तक ठीक है जब सूची के पहले तत्व का प्रकार अन्य सभी सूची तत्वों के प्रकार के सुपरक्लस जैसा ही होता है। यह एक बहुत ही भद्दा धारणा है, लेकिन सवाल में बाधाओं को अच्छी तरह से काम कर सकता है। वास्तव में –

+1

। ओपी ने कहा "मुझे पता है कि सजातीय है", लेकिन यह ऐसा कुछ है जो "extralinguistic" नहीं होना चाहिए। – Bozho

+0

'सूची ' के लिए ठीक है। 'सूची ' – finnw

-1

आप गतिशील रूप से एक प्रकार केवल कार्यावधि में जाना जाता है के आधार पर एक सरणी बनाने की आवश्यकता है (कहते हैं कि तुम प्रतिबिंब या जेनरिक कर रहे हैं) तो आप शायद चाहता हूँ Array.newInstance

+0

आप डाउनवोट नहीं कर सकते और क्यों नहीं समझा सकते हैं। यह समाधान की तरह लगता है। –

1

यह विधि प्रकार सुरक्षित है, और कुछ नल को नियंत्रित करता है (कम से कम एक तत्व गैर-शून्य होना चाहिए)।

public static Object[] toArray(Collection<?> c) 
{ 
    Iterator<?> i = c.iterator(); 
    for (int idx = 0; i.hasNext(); ++idx) { 
    Object o = i.next(); 
    if (o != null) { 
     /* Create an array of the type of the first non-null element. */ 
     Class<?> type = o.getClass(); 
     Object[] arr = (Object[]) Array.newInstance(type, c.size()); 
     arr[idx++] = o; 
     while (i.hasNext()) { 
     /* Make sure collection is really homogenous with cast() */ 
     arr[idx++] = type.cast(i.next()); 
     } 
     return arr; 
    } 
    } 
    /* Collection is empty or holds only nulls. */ 
    throw new IllegalArgumentException("Unspecified type."); 
} 
संबंधित मुद्दे

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