2013-05-20 9 views
25

Im utilizzando un ArrayList e im cercando di copiare una parte di esso ad un altro ArrayList pertanto im utilizzando:Conversione di un elenco secondario di un ArrayList a un ArrayList

Dove "sibling.keys" è il nuovo ArrayList e "keys or this.keys" è il vecchio ArrayList. Ho usato il casting perché eclissi mi ha detto di farlo, ma poi getta un ClassCastException:

java.util.ArrayList $ elenco secondario non può essere lanciato a java.util.ArrayList

Qualche consiglio?

risposta

71

subList restituisce un visualizza in un elenco esistente. Non è un ArrayList. È possibile creare una copia di esso:

sibling.keys = new ArrayList<Integer>(keys.subList(mid, this.num)); 

Oppure, se siete soddisfatti del comportamento vista, provare a cambiare il tipo di sibling.keys essere solo List<Integer> invece di ArrayList<Integer>, in modo che non è necessario per rendere la copia:

sibling.keys = keys.subList(mid, this.num); 

e 'importante capire la differenza anche se - hai intenzione di mutare sibling.keys (ad esempio aggiungendo valori ad esso o mutevoli elementi esistenti)? Hai intenzione di mutare keys? Vuoi la mutazione di una lista per influenzare l'altra?

+0

Un'altra opzione facile che ha funzionato per me era sibling.keys.addAll (keys.subList (mid, this.num)); Si presume che sibling.keys sia già inizializzato. addAll() copia semplicemente ciascun elemento della sottolista. –

-1

Array.subList non restituisce un ArrayList, ma un List.

Così la seguente riga funziona:

List<Integer> keys = (List<Integer>) keys.subList(mid, this.num); 

Nota che il cast è opzionale.

+1

Ritorna già 'Elenco '. Questo cast è ridondante. – IlyaEremin

0

Si ottiene l'eccezione del cast di classe perché ci si aspetta un ArraList mentre ArrayList.subList() non restituisce ArrayList. Cambia il tuo sibling.keys da ArrayList a List e dovrebbe funzionare correttamente. Questo eviterà ClassCastException così come non sarà necessario ed alcun cast.