Arrays.asList()
non può essere applicato a un array di tipo primitivo come previsto. Se applicato a int[]
, Arrays.asList()
produce un elenco di int[]
s anziché un elenco di Integer
s. Pertanto mischia una lista appena creata di int[]
.
Questo è un comportamento sottile di argomenti variadici e generici in Java. Arrays.asList()
è dichiarato come
public static <T> List<T> asList(T... a)
Quindi, può richiedere diversi argomenti di un certo tipo T
e produrre una lista contenente questi argomenti, o si può prendere un argomento di tipo T[]
e restituire una lista sostenuta da questo array (che è come argomenti variadici funzionano).
Tuttavia, quest'ultima opzione funziona solo quando T
è un tipo di riferimento (cioè non un tipo primitivo come int
), perché solo tipi di riferimento possono essere utilizzati come parametri tipo a generici (e T
è un parametro di tipo).
Quindi, se si passa int[]
, si ottiene T
= int[]
e il codice non funziona come previsto. Ma se si passa matrice di tipo di riferimento (ad esempio, Integer[]
), si ottiene T
= Integer
e tutto funziona:
Integer[] arr = new Integer[10];
for (int i = 0; i < arr.length; i++) {
arr[i] = i;
}
Collections.shuffle(Arrays.asList(arr));
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
WOW !!! Ma tutti hanno detto che le modifiche applicate per la lista, non con l'array arr. Perché funziona? – Dmitry
Poiché Arrays.asList() crea un nuovo elenco supportato dall'array. Non copia l'array come altri hanno affermato. Ogni modifica alla lista restituita da Arrays.asList() cambia anche l'array che la supporta. – ILMTitan
Capito ora. Ma perché questo non funziona con i tipi primitivi? – Dmitry