Remove() в списке, созданном с помощью Arrays.asList() throws UnsupportedOperationException

У меня есть коллекция c1<MyClass> и массив a<MyClass>. Я пытаюсь преобразовать массив в коллекцию c2 и сделать c1.removeAll(c2), но это вызывает UnsupportedOperationException. Я обнаружил, что класс asList() класса Arrays возвращает класс Arrays.ArrayList, и этот класс наследует removeAll() из AbstractList(), реализация которого бросает UnsupportedOperationException.

    Myclass la[] = getMyClass();
    Collection c = Arrays.asList(la);
    c.removeAll(thisAllreadyExistingMyClass);

Есть ли способ удалить элементы? пожалуйста, помогите

Ответ 1

Arrays.asList возвращает обертку List вокруг массива. Эта оболочка имеет фиксированный размер и напрямую поддерживается массивом, и поэтому вызовы set будут изменять массив, а любой другой метод, который изменяет список, выдает UnsupportedOperationException.

Чтобы исправить это, вам необходимо создать новый изменяемый список, скопировав содержимое списка обертки. Это легко сделать с помощью конструктора ArrayList, который принимает Collection:

Collection c = new ArrayList(Arrays.asList(la));

Ответ 2

Yup, Arrays.asList(..) - это коллекция, которая не может быть расширена или сжата (поскольку она поддерживается исходным массивом и ее нельзя изменить).

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

Ответ 3

Так работает Array.asList(), потому что он напрямую поддерживается массивом. Чтобы получить полностью изменяемый список, вам придется клонировать коллекцию в созданную вами коллекцию.

Collection c = new ArrayList(Arrays.asList(la))

Ответ 4

Чтобы исправить эту ошибку, вы также можете попробовать this.I надеюсь, что это полезно

    List<ChunkId> idList = new ArrayList<>();
    idList.addAll(Arrays.asList(ids.toArray(new ChunkId[0])));