3

我的功能有问题。该代码对我来说工作得很好,当布尔属性为真时它会删除一个项目:

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();
    }
  }
}

现在我可以用CollectionsTypeCarPlanShipPlan

doRemoveAusgefallenePlaene(pAllCarPlan);
doRemoveAusgefallenePlaene(pAllShipPlan);

并且代码编译没有问题。不幸的是,在执行时抛出了 UnsupportedOperationException

lPlanIterator.remove();

我想我通过声明Collection<? extends Plan>. 知道任何人的问题吗?

-- 更新 -- 对于那些对一种可能的解决方案感兴趣的人:

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 回答