2010-11-22 7 views
9

毎回、java.util.Listで.remove()メソッドを使用すると、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); 
     } 
    } 
} 

スタックトレース:私はORMの例のリストに私はListインタフェースより正確なクラスを使用する必要があることがわかりますが、everywehere

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

が使用されている...

+0

Listの実装を使用している場合、スタックトレースはこれを明白にする必要があります。 –

+0

ORMを使用しているようです。これを行う正しい方法を判断するには、ドキュメントを調べることをお勧めします。 –

+0

あなたのリストにエントリがあることを確認しますか? remove()は適切な方法です。あなたの完全なstacktraceを投稿してください、多分そこにいくつかのより多くの情報があります。 – 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実装は削除操作をサポートしていません。

注:ListArrayListである必要はありません。それはあらゆる実装であり、時にはカスタムでもあります。

2

は、事は変わりません、オブジェクト自体はリストのまま、したがって、あなただけあなたが試してみてくださいどのようなリストのプロパティ

を使用することができますが、それを作成することです。このような新しいArrayListを使用して