Rispondendo a una domanda su che qui: https://stackoverflow.com/a/9872630/82609Perché possiamo usare array con riferimento generico
ho cercato di fare quanto segue:
Comparator<String>[] comparators = new Comparator[] {...};
Funziona! Ma quanto segue non lo fa:
Comparator<String>[] comparators = new Comparator<String>[] {...};
Sulla relativa domanda, ho fatto l'ipotesi:
Credo che sia perché inizialmente il contratto matrice può essere qualcosa come questo:
Se si crea un array di tipo X, non sarà MAI MAI possibile mettere in qualsiasi cosa IS-NOT-AN X. Se si t ry, si otterrà un ArrayStoreException
Permettendo così array con la creazione di farmaci generici porterebbero ad un diverso regola come:
Se si crea una matrice di tipo
X<Y>
, non si sarà mai mai in grado a metti qualsiasi cosa che non sia AN X. Se ci provi, riceverai un valore di ArrayStoreException . Ma puoi aggiungere entrambi gli oggettiX<Y>
eX<Z>
a causa della cancellazione dei tipi!
Ma a pensarci, sarebbe davvero essere un problema di avere:
Comparator<String>[] comparators = new Comparator<String>[] {...};
Io non capisco il motivo per cui non è possibile, dal momento che con una cosa del genere sarebbe:
- Controllare le classi inseriti in fase di esecuzione
- Controllare il tipo di corsi inseriti al momento della compilazione
Infine possiamo usare un array con riferimento di tipo generico e per l'impossibilità di creare un array con un tipo generico, credo che molte persone non sanno nemmeno che sia possibile.
Mi chiedo solo se qualcuno conosce il motivo di questa scelta?
E 'un po' come costringendo le persone a utilizzare List<String> = new ArrayList();
invece di utilizzare List<String> = new ArrayList<String>();
dimitrisli ti ha dato un bel exemple dal famoso libro di Joshua Bloch. Come l'ha spiegato, è pericoloso utilizzare entrambi gli array generici + covarianza e potrebbe portare a ClassCastException mentre ci si aspetta che ArrayStoreException da un array utilizzi la covarianza.
Ma vi prego di notare il seguente è ancora legale e portare alla stessa:
List<String>[] stringLists = new List[1];
List<Integer> intList = Arrays.asList(42);
Object[] objects = stringLists;
objects[0] = intList;
String s = stringLists[0].get(0);
tuttavia produce un avvertimento getto incontrollato in fase di compilazione, e come si menzionate, un ClassCastException in fase di esecuzione.
possibile duplicato di [Errore creazione matrice generica] (http://stackoverflow.com/questions/3903196/error-generic-array-creation) –
@DaveWebb cosa è duplicato? –
Qualcuno ha già fatto la stessa domanda. http://stackoverflow.com/questions/3903196/error-generic-array-creation –