2008-09-16 9 views
18

En el marco de las colecciones de Java, la interfaz Collection declara el siguiente método:¿Cómo crear una instancia de una matriz de Java dado un tipo de matriz en tiempo de ejecución?

<T> T[] toArray(T[] a)

Devuelve una matriz que contiene todos los elementos de esta colección; el tipo de tiempo de ejecución de la matriz devuelta es el de la matriz especificada. Si la colección se ajusta a la matriz especificada, se devuelve allí. De lo contrario, se asigna una nueva matriz con el tipo de tiempo de ejecución de la matriz especificada y el tamaño de esta colección.

Si quisiera poner en práctica este método, ¿cómo crear una matriz del tipo de un, conocido sólo en tiempo de ejecución?

Respuesta

3
Array.newInstance(Class componentType, int length) 
19

Al observar cómo ArrayList hace:

public <T> T[] toArray(T[] a) { 
    if (a.length < size) 
     a = (T[])java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), size); 
    System.arraycopy(elementData, 0, a, 0, size); 
    if (a.length > size) 
     a[size] = null; 
    return a; 
} 
-1

Para crear una nueva matriz de un tipo genérico (que solo se conoce en tiempo de ejecución), debe crear una matriz de Objetos y simplemente lanzarlo al tipo genérico y luego usarlo como tal. Esta es una limitación de la implementación de genéricos de Java (borrado).

T[] newArray = (T[]) new Object[X]; // where X is the number of elements you want. 

La función toma entonces la matriz dada (a) y la utiliza (control de su tamaño de antemano) o crea una nueva.

+3

A diferencia de todas las demás respuestas aquí, esta forma * no * crea una matriz de T. Debido a la eliminación, puede asignarla a T [], pero no siempre saldrá impune. Si en una instancia específica, T es String, y la matriz que creó allí (devuelta a otro método y) asignada a String [] (que no requerirá un molde), obtendrá una ClassCastException inesperada. Este es un ejemplo de tipo de contaminación. No lo hagas! –

Cuestiones relacionadas