Originariamente inviato da andbin
Sì, è tecnicamente possibile ma c'è una questione concettuale e tecnica di fondo molto importante.

I Generics sono implementati per "erasure". Vuol dire che quando ad esempio istanzi un TuaClasse<String>, all'interno di questo oggetto non c'è scritto da alcuna parte che "è di String". Per erasure quel T diventa Object.

Cosa vuol dire? Vuol dire che tu tecnicamente, se volessi, potresti offrire un metodo del tipo:

public Object[] getElements()

Al suo interno istanzi un Object[], lo popoli e lo restituisci. Ma sarebbe limitato. Perché il "client" che lo usa deve per forza usarlo come Object[]. Non può fare un cast a String[]. Se un array è un Object[] ... chiaramente non è un String[], intendo dire proprio come tipo dell'array in sé.

Ma se volessi fare in modo che se T è String si vuole restituire un array che sia davvero un String[] ? Si può fare ma ripeto la questione sopra: il tuo oggetto TuaClasse non "sa" che tu l'hai istanziata parametrizzandola con <String>.

Come si fa allora? Semplice: la soluzione "tipica" è quella di passare al metodo un array di quel tipo! E tramite "reflection" viene dedotto il tipo effettivo dell'array.

Hai mai visto che in java.util.List ci sono 2 metodi toArray() ?

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

Il secondo deve ricevere un array (anche "vuoto", di dimensione 0) affinché si possa avere un array di quel giusto tipo con gli elementi della lista.
Capisco, ti ringrazio, effettivamente avevo visto quei due metodi ed infatti non capivo il perché di quel parametro.

Quindi per il momento non sembra esserci via d'uscita (non che sia importante), a quanto ho capito se Array.newInstance() fosse implementato diversamente si potrebbe fare ma per ora no...