Ho notato che in Java Array.newInstance()
restituisce Object
, anziché T[]
. È comprensibile che questo metodo sia stato introdotto prima che Java supporti tipi generici.Esistono versioni generiche di Array.newInstance?
Tuttavia è una sorpresa che non ci siano versioni generiche equivalenti di questo. Java 7's Arrays.copyOf
non è lo stesso - copia il contenuto del parametro, piuttosto che creare un nuovo array fittizio (con tutti gli oggetti null all'interno).
Dal momento che l'implementazione di questo sembra banale, c'è qualche motivo per non aggiungerlo nel JRE? o non riesco a trovarne uno?
UPDATE
Sembra io fornire la mia realizzazione "banale" per fermare fraintendere della questione.
class MyArrayUtil {
//Generic version for classes
@SuppressWarnings("unchecked")
public static <T> T[] newArrayOf(T[] t, int len){
return (T[]) Array.newInstance(t.getClass().getComponentType(), len);
}
//For array of int
public static int[] newArrayOf(int[] t, int len){
return new int[len];
}
//For other primitive types...
}
Non sto postando questo codice come risposta perché non è la risposta della domanda. La domanda è per la ragione e/o il codice esistente, non come implementare.
UPDATE
Ho aggiornato il codice per renderlo simile a Arrays.copyOf
, e il vantaggio è che il programmatore può semplicemente cambiare il tipo di parametro per regolare il codice per un altro tipo. Inoltre ho eliminato l'uso di Array.newInstance
per i tipi primitivi.
No, è impossibile implementarlo in modalità sicura in modalità compilazione. Ad esempio, non puoi creare una nuova istanza di a: 'Lista []'. Il compilatore non saprà mai quale sia il tipo di 'T', e quindi non può garantire che il codice client sia sicuro. –
Muel
Dato che 'Arrays.copyOf' può fare il lavoro non ci sono ragioni ovvie per cui non si può. –
'Arrays.copyOf' determina il tipo concreto dall'array da copiare. – pstanton