从Collection <! - 中删除项目?扩展MyObject - > UnsupportedOperationException

时间:2013-03-15 13:43:47

标签: java generics collections

我的功能出了问题。 该代码对我来说非常好,它在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();
    }
  }
}

现在我可以使用Collections CarPlanShipPlan

doRemoveAusgefallenePlaene(pAllCarPlan); doRemoveAusgefallenePlaene(pAllShipPlan); 来调用该函数
lPlanIterator.remove();

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

Collection<? extends Plan>

我认为我通过声明final List<CarPlan> lAllCarPlan = new ArrayList<CarPlan>(pAllCarPlan); doRemoveAusgefallenePlaene(lAllCarPlan); 来理解错误。 知道任何人的问题吗?

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

ShipPlan

适用于CarPlan和{{1}}。

2 个答案:

答案 0 :(得分:6)

你可能正在迭代一个不可修改的集合,它的迭代器因此不支持remove操作。

不可修改的集合示例包括Collections.unmodifiableXX()生成的集合。 Arrays.asList()返回的列表不是完全不可修改的(您可以在特定索引处设置元素),但不支持添加或删除操作,因为它是由您传入的数组直接支持的。

来自Javadoc for remove()

  

抛出:UnsupportedOperationException - 如果此迭代器不支持remove操作

您需要查看传入的内容,并确保实际上可以修改集合的结构。您尚未向我们展示该代码。

答案 1 :(得分:2)

来自@dmeister的其他回复:Why aren't Java Collections remove methods generic?

  

Josh Bloch和Bill Pugh在“Java Puzzlers IV:The   幻影参考威胁,克隆人的攻击和复仇   Shift“(Google TechTalk)。

     

Josh Bloch说(6:41)他们试图使get方法变得一致   Map,删除方法和其他一些,但“它根本不起作用”。   如果有太多合理的程序无法通知   您只允许集合的泛型类型作为参数类型。   他给出的例子是数字列表和a的交集   Longs列表。