2010-06-30 14 views

Respuesta

13

La conversión ocurrirá en tiempo de ejecución, mientras que el tipo se pierde en tiempo de compilación. Por lo que debe hacer algo como:

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); 
} 

Pero ten en cuenta que la tercera línea anterior puede lanzar una excepción - no es Typesafe.

+2

+1: Está bien siempre que el tipo del primer elemento de la lista sea el mismo o una superclase del tipo de todos los demás elementos de la lista. Esa es una suposición muy astuta, pero bien podría funcionar dadas las limitaciones en la pregunta. –

+1

de hecho. el OP dijo "que sé que es homogéneo", pero eso es algo que no debería ser "extralingüístico". – Bozho

+0

Bien para una 'Lista '. Completamente inútil para una 'Lista ' – finnw

-1
java.lang.reflect.Array.newInstance(Class<?> componentType, int length) 
-1

Si necesita crear dinámicamente una matriz basada en un tipo conocido sólo en tiempo de ejecución (decir que estás haciendo reflexión o genéricos) es probable que desee Array.newInstance

+0

no se puede downvote y no explicar por qué. Esto suena como la solución. –

1

Este método es seguro y maneja algunos valores nulos (al menos un elemento debe ser no nulo).

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."); 
} 
Cuestiones relacionadas