2015-05-05 2 views
1

Какое значение для «zs» вы ожидаете после запуска следующего фрагмента?Переменная списка со списком, созданным Arrays.asList, имеет неожиданный результат. Зачем?

Collection<Integer> xs = Arrays.asList(1,2,3); 
int[] ys = {1}; 
List<Integer> zs = new ArrayList<>(xs); 
zs.removeAll(Arrays.asList(ys)); 

я ожидал бы список, содержащий 2 и 3. Однако, с JDK 1.8.0_25 в Eclipse, 4.5 М7 это список, содержащий 1, 2, 3. Удаление не имеет никакого эффекта. Однако, когда я указываю «YS» как непримитивных массив, я получаю ожидаемый результат:

Collection<Integer> xs = Arrays.asList(1,2,3); 
Integer[] ys = {1}; 
List<Integer> zs = new ArrayList<>(xs); 
zs.removeAll(Arrays.asList(ys)); 

Что здесь происходит?

+5

Вы уверены, что 'Arrays.asList (ys)' имеет тип, который вы думаете? (Я думаю, что это «Список ») –

+1

Мораль этой истории: varargs, generics и массивы примитивов не играют хорошо вместе. – biziclop

ответ

6

Тип Arrays.asList(int[]): List<int[]>. Таким образом, ни один из элементов в xs не содержится в этом списке.