3

機能に問題がありました。そのコードは私にとってはかなりうまく機能します.boolean属性がtrueの場合、アイテムを削除します:

private void doRemoveAusgefallenePlaene(Collection<CarPlan> pAllCarPlan) {
for (Iterator<CarPlan> lCarPlanIterator = pAllCarPlan.iterator(); lCarPlanIterator.hasNext();) {
  CarPlan lCarPlan = lCarPlanIterator.next();
  if (!lCarPlan.isAusfall()) {
    lCarPlanIterator.remove();
  }
}
}

私の希望は、タイプのオブジェクトとCarPlan同様に関数を使用することでしたShipPlan(どちらもインターフェイスを実装していますPlan)。

private void doRemoveAusgefallenePlaene(Collection<? extends Plan> pAllPlan) {
  for (Iterator<? extends Plan> lIterator = pAllPlan.iterator(); lPlanIterator.hasNext();) {
    Plan lPlan = lPlanIterator.next();
    if (!lPlan.isAusfall()) {
      lPlanIterator.remove();
    }
  }
}

CollectionsTypeCarPlanとType を使用して関数を呼び出すことができますShipPlan

doRemoveAusgefallenePlaene(pAllCarPlan);
doRemoveAusgefallenePlaene(pAllShipPlan);

コードは問題なくコンパイルされます。残念ながら、実行時に UnsupportedOperationException がインラインでスローされます

lPlanIterator.remove();

を宣言することで、何か間違ったことを理解していると思いますCollection<? extends Plan>。誰でも問題を知っていますか?

-- 更新 -- 考えられる解決策の 1 つに興味がある人向け:

final List<CarPlan> lAllCarPlan = new ArrayList<CarPlan>(pAllCarPlan);
doRemoveAusgefallenePlaene(lAllCarPlan);

と でうまく機能しShipPlanますCarPlan

4

2 に答える 2

6

おそらく、変更不可能なコレクションを繰り返し処理しているため、そのイテレータは削除操作をサポートしていません。

変更不可能なコレクションの例には、 によって作成されたコレクションが含まれCollections.unmodifiableXX()ます。によって返されるリストは、Arrays.asList()完全に変更できないわけではありません (特定のインデックスに要素を設定できます) が、渡す配列によって直接サポートされるため、追加または削除操作はサポートされません。

Javadocからremove()

例外: UnsupportedOperationException- この反復子が削除操作をサポートしていない場合

渡す内容を確認し、コレクションの構造を実際に変更できることを確認する必要があります。あなたは私たちにそのコードを見せていません。

于 2013-03-15T13:48:35.833 に答える
2

@dmeister からのこの他の応答から: Java コレクションが一般的なメソッドを削除しないのはなぜですか?

Josh Bloch と Bill Pugh は、「Java Puzzlers IV: The Phantom Reference Menace, Attack of the Clone, and Revenge of The Shift」(Google TechTalk) でこの問題について言及しています。

Josh Bloch は (6:41)、Map の get メソッド、remove メソッドなどを生成しようとしたが、「うまくいかなかった」と述べています。コレクションのジェネリック型のみをパラメーター型として許可すると、ジェネリック化できない合理的なプログラムが多すぎます。彼が示した例は、数値のリストと長整数のリストの共通部分です。

于 2013-03-15T13:47:04.060 に答える