2010-11-22 15 views
9

Cada vez que uso el método .remove() en java.util.List obtengo el error UnsupportedOperationException. Eso me vuelve loco. Lanzar a ArrayList no ayuda. Como hacer eso ?Cómo eliminar elementos de 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) 
    ... 

veo que tengo que usar la clase más exacta que la interfaz de lista, pero everywehere en los ejemplos ORM se usa la lista ...

+0

qué implementación de Lista está utilizando, el seguimiento de la pila debería hacer esto obvio. –

+0

Parece que estás usando algunos ORM. Es posible que desee consultar sus documentos para determinar la forma correcta de hacerlo. –

+0

¿Seguro que su lista tiene entradas? remove() debería ser el camino correcto a seguir. por favor, publique su stacktrace completo, tal vez haya más información en él. – oezi

Respuesta

23

Desafortunadamente, no todas las listas le permiten eliminar elementos. A partir de la documentación de List.remove(int index):

elimina el elemento en la posición especificada en esta lista (operación opcional).

No hay mucho que pueda hacer al respecto, excepto crear una nueva lista con los mismos elementos que la lista original, y eliminar los elementos de esta nueva lista. De esta manera:

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

buena respuesta (+1), pero desafiaría la palabra "Desafortunadamente". Creo que es una característica que algunas listas son inmutables. –

+0

+1 para el trabajo alrededor. – JeremyP

+0

Gracias. Eso funciona para mí :) – marioosh

7

Su simplemente significa que el la implementación subyacente List no admite operaciones de eliminación.

NOTA: List no tiene que ser un ArrayList. Puede ser cualquier implementación y, a veces, personalizada.

2

casting a su lista de lista de arreglo no va a cambiar una cosa, el objeto en sí se mantiene una lista y por lo tanto sólo se puede utilizar la lista de propiedades

lo que se debe tratar es crearlo con el nuevo ArrayList

Cuestiones relacionadas