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.