2010-11-22 6 views
9

Каждый раз, когда я использую метод .remove() на java.util.List, я получаю ошибку UnsupportedOperationException. Это делает меня сумасшедшим. Кастинг в ArrayList не помогает. Как это сделать ?Как удалить элемент из java.util.List?

@Entity 
@Table(name = "products") 
public class Product extends AbstractEntity { 

    private List<Image> images; 

    public void removeImage(int index) { 
     if(images != null) { 
      images.remove(index); 
     } 
    } 
} 

StackTrace:

java.lang.UnsupportedOperationException 
java.util.AbstractList.remove(AbstractList.java:144) 
model.entities.Product.removeImage(Product.java:218) 
    ... 

Я вижу, что мне нужно использовать более точный класс, чем интерфейс List, но everywehere в примерах ОРМ используется список ...

+0

, который используется в реализации списка, трассировка стека должна сделать это очевидным. –

+0

Похоже, вы используете ORM. Вы можете обратиться к своим документам, чтобы определить правильный способ сделать это. –

+0

уверены, что в вашем списке есть записи? remove() должен быть правильным способом. отправьте свой полный стек, возможно, в нем есть дополнительная информация. – oezi

ответ

23

К сожалению, не все списки позволяют удалять элементы. Из документации List.remove(int index):

Удаляет элемент в указанной позиции в этом списке (дополнительная работа).

Существует не так много, вы можете сделать с ним, за исключением создания нового списка с теми же элементами, что и исходный список, и удалить элементы из этого нового списка. Как это:

public void removeImage(int index) { 
    if(images != null) { 
     try { 
      images.remove(index); 
     } catch (UnsupportedOperationException uoe) { 
      images = new ArrayList<Image>(images); 
      images.remove(index); 
     } 
    } 
} 
+5

хороший ответ (+1), но я бы бросил вызов слову «К сожалению». Я думаю, что это особенность, что некоторые списки неизменяемы. –

+0

+1 для работы вокруг. – JeremyP

+0

Спасибо. Это работает для меня :) – marioosh

7

Ее просто означает, что лежащая в основе List реализация не поддерживает операцию удаления.

ПРИМЕЧАНИЕ: List не обязательно должен быть ArrayList. Это может быть любая реализация, а иногда и обычай.

2

Кастинг список в список массива не будет ничего менять, сам объект остается список, и поэтому вы можете использовать только свойство List

, что вы должны попробовать это создать его с новым ArrayList

Смежные вопросы