2013-03-15 28 views
3

我的功能有问题。 该代码工作很对我很好,什么时候布尔属性为true删除一个项目:从收藏<?删除项目?扩展MyObject> UnsupportedOperationException

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

现在我可以调用函数与CarPlan类型的CollectionsShipPlan

doRemoveAusgefallenePlaene(pAllCarPlan); 
doRemoveAusgefallenePlaene(pAllShipPlan); 

和代码编译没有问题。不幸的是,在执行时间UnsupportedOperationException异常是线

lPlanIterator.remove(); 

抛出我想我明白了什么问题通过声明Collection<? extends Plan>。 知道任何人的问题?

- 更新 - 对于那些有兴趣谁在一个可能的解决方案:

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

ShipPlanCarPlan的伟大工程。

+0

您是否尝试过使用“Collection ”? – 2013-03-15 13:50:22

+0

是的,但后来我无法传递ShipPlan或CarPlan类型的集合。我描述的函数是businesscase doSomethingWithShip和doSomethingWithCar的一部分。我没有接口变量,也不允许进行类型转换。 – 2013-03-15 13:55:21

回答

6

您可能正在迭代一个不可修改的集合,其迭代器因此将不支持删除操作。

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

Javadoc for remove()

抛出:UnsupportedOperationException - 如果移除操作不会被这个迭代

你需要看看你传递什么,并确保支持该集合的结构实际上可以修改。您没有向我们显示该代码。

+0

因此将集合转换为列表应该解决问题? – 2013-03-15 13:51:09

+1

@StefanBe:这取决于列表。主要的'ArrayList'和'LinkedList'在结构上是可修改的,所以它们的迭代器支持移除。正如我所说的,由'Arrays.asList()'创建的列表不支持它。 – 2013-03-15 13:51:51

2

从从@dmeister这个其他回应:Why aren't Java Collections remove methods generic?

乔希布洛赫和比尔·皮尤是指这个问题在“Java的谜题四: 虚引用的威胁,克隆人的进攻,和的 复仇Shift“(Google TechTalk)。 (6:41)他们试图对Map的get方法 进行基因化,除去方法和其他一些方法,但是“它根本不起作用”。 如果 只允许泛型类型的集合作为参数类型,那么有太多合理的程序不能被聚合。 他给出的例子是一列数字和一个长列表的交集。

+0

我不确定这个问题的相关性。 Stefan试图使用集合的删除方法没有任何用处。 – 2013-03-15 13:54:49