Come creare un'istanza di un array Java dato un tipo di array in fase di esecuzione?

StackOverflow https://stackoverflow.com/questions/77387

  •  09-06-2019
  •  | 
  •  

Domanda

Nel framework delle raccolte Java, l'interfaccia Collection dichiara il seguente metodo:

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

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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top