2010-11-22 11 views
9

Chaque fois que j'utilise la méthode .remove() sur java.util.List, j'obtiens une erreur UnsupportedOperationException. Ça me rend fou. Casting à ArrayList n'aide pas. Comment faire ça ?Comment supprimer des éléments 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) 
    ... 

Je vois que je dois utiliser la classe plus exacte que la liste interface, mais everywehere dans les exemples ORM est utilisé ... Liste

+0

quelle implémentation de List utilisez-vous, la trace de la pile devrait rendre cela évident. –

+0

Il semble que vous utilisiez un ORM. Vous pouvez consulter ses documents pour déterminer la bonne façon de procéder. –

+0

Assurez-vous que votre liste a entrys? remove() devrait être la bonne façon de procéder. s'il vous plaît poster votre stacktrace complète, peut-être y at-il plus d'informations à l'intérieur. – oezi

Répondre

23

Malheureusement, toutes les listes ne vous permettent pas de supprimer des éléments. De la documentation List.remove(int index):

Supprime l'élément à la position spécifiée dans cette liste (opération facultative).

Vous ne pouvez pas faire grand-chose, sauf créer une nouvelle liste avec les mêmes éléments que la liste originale et supprimer les éléments de cette nouvelle liste. Comme ceci:

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

bonne réponse (+1), mais je contesterais le mot "malheureusement". Je pense que c'est une caractéristique que certaines listes sont immuables. –

+0

+1 pour le travail autour. – JeremyP

+0

Merci. Cela fonctionne pour moi :) – marioosh

7

Son signifie simplement que le l'implémentation sous-jacente List ne prend pas en charge l'opération de suppression. REMARQUE: List ne doit pas nécessairement être ArrayList. Cela peut être n'importe quelle implémentation et parfois personnalisée.

2

casting liste à la liste de tableau ne changera pas une chose, l'objet lui-même reste une liste et donc vous ne pouvez utiliser la liste des propriétés

ce que vous devez faire est de créer Avec la nouvelle ArrayList

Questions connexes