2010-11-22 11 views
9

Ogni volta che uso il metodo .remove() su java.util.List ottengo l'errore UnsupportedOperationException. Mi fa impazzire. Il casting su ArrayList non aiuta. Come farlo ?Come rimuovere l'elemento da 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) 
    ... 

vedo che ho bisogno di utilizzare la classe più precisa di interfaccia List, ma everywehere negli esempi ORM è abituato Lista ...

+0

quale implementazione List si sta utilizzando, la traccia dello stack dovrebbe rendere evidente questo. –

+0

Sembra che tu stia usando un ORM. Si consiglia di consultare i suoi documenti per determinare il modo corretto per farlo. –

+0

sicuro che la tua lista sia entrata? remove() dovrebbe essere la giusta via da percorrere. per favore pubblica il tuo stacktrace completo, forse ci sono altre informazioni in esso. – oezi

risposta

23

Sfortunatamente, non tutti gli elenchi consentono di rimuovere elementi. Dalla documentazione di List.remove(int index):

Rimuove l'elemento nella posizione specificata in questo elenco (operazione opzionale).

Non c'è molto che si possa fare a questo proposito, tranne creare un nuovo elenco con gli stessi elementi dell'elenco originale e rimuovere gli elementi da questo nuovo elenco. Come questo:

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

bella risposta (+1), ma sfiderei la parola "sfortunatamente". Penso che sia una caratteristica che alcune liste sono immutabili. –

+0

+1 per il lavoro in giro. – JeremyP

+0

Grazie. Questo funziona per me :) – marioosh

7

suo significa semplicemente che il l'implementazione List sottostante non supporta l'operazione di rimozione.

NOTA: List non deve essere un ArrayList. Può essere qualsiasi implementazione e talvolta personalizzata.

2

Casting vostra lista di lista di array non cambierà nulla, l'oggetto stesso rimane un elenco e quindi si può solo utilizzare le proprietà Elenco

ciò che si dovrebbe provare è quello di crearlo con il nuovo ArrayList