Вопрос-ответ

UnsupportedOperationException when trying to remove from the list returned by Array.asList

Исключение UnsupportedOperationException при попытке удаления из списка, возвращаемого Array.asList

Я использую List для хранения некоторых данных, полученных при вызове Array.asList() метода. Затем я пытаюсь удалить элемент с помощью myList.Remove(int i) метода. Но пока я пытаюсь это сделать, я получаю UnsupportedOperationException. В чем причина этого? Как я должен решить эту проблему?

Переведено автоматически
Ответ 1

Array.asList() переносит массив в интерфейс списка. Список по-прежнему поддерживается массивом. Массивы имеют фиксированный размер - они не поддерживают добавление или удаление элементов, поэтому оболочка тоже не может.

В документах это не так ясно, как могло бы быть, но они действительно говорят:


Возвращает список фиксированного размера, поддерживаемый указанным массивом.


Бит "фиксированного размера" должен быть подсказкой о том, что вы не можете добавлять или удалять элементы :)

Хотя есть другие способы обойти это (другие способы создания нового ArrayList из массива) без дополнительных библиотек, я бы лично рекомендовал воспользоваться библиотекой Google Collections (или Guava, когда она будет выпущена). Затем вы можете использовать:

List<Integer> list = Lists.newArrayList(array);

Причина, по которой я предлагаю это, заключается в том, что GCL в целом хорош, и его стоит использовать.

Как отмечено в комментариях, для этого требуется копия массива; список не поддерживается исходным массивом, и изменения ни в одной коллекции не будут видны в другой.

Ответ 2

Это не так java.util.ArrayList. Arrays.asList() возвращает свою собственную List реализацию (с изменениями, "записанными" в массив.).

Это список фиксированного размера, поэтому он не поддерживает удаление.

Вы можете создать из него настоящий ArrayList:

new java.util.ArrayList<>(Arrays.asList(someArray));  

Должен признать, что это очень запутанно, как asList() работает.

Ответ 3

Пожалуйста, прочтите документацию API для Arrays.asList():


Возвращает список фиксированного размера, поддерживаемый указанным массивом. (Изменения возвращаемого списка "записываются" в массив.)


Обратите внимание, что Collections.remove(int) помечен в Javadocs как "необязательная операция", что означает, что не все коллекции будут ее поддерживать. "список фиксированного размера" означает, что вы не можете изменить размер списка, что сделала бы функция remove(). Таким образом, это не поддерживается.

Если вы хотите изменить список, сгенерированный Arrays.asList(), просто скопируйте его, например, new ArrayList(Arrays.asList(...)).

Ответ 4

Реализация, которую вы получаете от asList, не реализует полный интерфейс списка. Я бы преобразовал список в ArrayList, а затем внес в него изменения.

Смотрите remove().

java exception list