Arrays.asList()
нельзя применять к массивам примитивного типа, как вы ожидаете. При применении к int[]
, Arrays.asList()
создает список int[]
с вместо списка Integer
с. Поэтому вы перетасовываете вновь созданный список int[]
.
Это тонкое поведение переменных аргументов и обобщений в Java. Arrays.asList()
объявлен как
public static <T> List<T> asList(T... a)
Таким образом, он может принимать несколько аргументов некоторого типа T
и создавать список, содержащий эти аргументы, или он может принимать один аргумент типа T[]
и возвращать список, поддерживаемый этим массивом (так работают аргументы с переменным числом аргументов) ,
Однако последний вариант работает только в том случае, если T
является ссылочным типом (то есть не примитивным типом, таким как int
), поскольку в качестве параметров типа в обобщенных типах могут использоваться только ссылочные типы (а T
является параметр типа).
Итак, если вы передадите int[]
, вы получите T
= int[]
, и ваш код не будет работать должным образом. Но если вы передадите массив ссылочного типа (например, Integer[]
), вы получите T
= Integer
и все работает:
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] + " ");
}