Come creare un'istanza di un array Java dato un tipo di array in fase di esecuzione?
-
09-06-2019 - |
Domanda
Nel framework delle raccolte Java, l'interfaccia Collection dichiara il seguente metodo:
Restituisce un array contenente tutti gli elementi di questa raccolta;il tipo di runtime dell'array restituito è quello dell'array specificato.Se la raccolta rientra nell'array specificato, viene restituita al suo interno.In caso contrario, viene allocato un nuovo array con il tipo di runtime dell'array specificato e la dimensione di questa raccolta.
Se volessi implementare questo metodo, come creeresti un array del tipo di UN, noto solo in fase di esecuzione?
Soluzione
Utilizza il metodo statico
java.lang.reflect.Array.newInstance(Class<?> componentType, int length)
Un tutorial sul suo utilizzo lo trovate qui:http://java.sun.com/docs/books/tutorial/reflect/special/arrayInstance.html
Altri suggerimenti
Osservando come lo fa ArrayList:
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;
}
Array.newInstance(Class componentType, int length)
Per creare un nuovo array di un tipo generico (noto solo in fase di esecuzione), è necessario creare un array di oggetti e semplicemente eseguirne il cast sul tipo generico e quindi utilizzarlo come tale.Questa è una limitazione dell'implementazione generica di Java (cancellazione).
T[] newArray = (T[]) new Object[X]; // where X is the number of elements you want.
La funzione quindi prende l'array fornito (a) e lo utilizza (controllandone prima le dimensioni) o ne crea uno nuovo.