remove () su List creato da Arrays.asList () lancia UnsupportedOperationException

Ho una collezione c1 e una matrice a . Sto provando a convertire l’array in una raccolta c2 e faccio c1.removeAll(c2) , ma questo genera UnsupportedOperationException . Ho scoperto che la asList() della class Array restituisce la class Arrays.ArrayList e questa class eredita la removeAll() da AbstractList() cui implementazione genera UnsupportedOperationException .

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

C’è un modo per rimuovere gli elementi? per favore aiuto

Arrays.asList restituisce un wrapper List attorno a un array. Questo wrapper ha una dimensione fissa ed è direttamente supportato dall’array, e come tale le chiamate set modificheranno la matrice, e qualsiasi altro metodo che modifica la lista genererà una UnsupportedOperationException .

Per risolvere questo problema, devi creare un nuovo elenco modificabile copiando i contenuti dell’elenco wrapper. Questo è facile da fare utilizzando il costruttore ArrayList che accetta una Collection :

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

Arrays.asList(..) , Arrays.asList(..) è una raccolta che non può essere espansa o ridotta (perché è supportata dall’array originale e non può essere ridimensionata).

Se si desidera rimuovere elementi, creare una new ArrayList(Arrays.asList(..) o rimuovere elementi direttamente dalla matrice (che sarà meno efficiente e più difficile da scrivere)

Questo è il modo in cui Array.asList() funziona, perché è direttamente supportato dall’array. Per ottenere un elenco completamente modificabile, devi clonare la raccolta in una raccolta creata da te.

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