我需要覆盖客户端ArrayList中的add()和remove()方法。
如果我添加或删除客户端,则必须自动更新列表中客户端的订单总和。
其实我有这样的事情:
public class Path {
private ArrayList<Client> clients = new ArrayList<Client>() {
@Override
public boolean add(Client e) {
boolean allOk = super.add(e);
if (allOk)
calcTotalOrder();
return allOk;
}
@Override
public boolean remove(Client e) {
boolean allOk = super.remove(e);
if (allOk)
calcTotalOrder();
return allOk;
}
};
}
覆盖add()方法时我没有问题,它实际上完全符合我的要求,但与remove()的运气不一样。
我收到以下错误:&#34; new ArrayList(){}类型的remove(Client)方法必须覆盖或实现超类型方法&#34;。
Eclipse的提议是消除@Override
我做错了什么?
答案 0 :(得分:1)
由于历史原因,Object
方法不是多态的,即它必须支持删除任意T
而不是remove()
类型的对象。
但是,您必须记住也要覆盖相应的迭代器方法(因为调用ArrayList
不是将事物添加到set()
中的唯一方法),以及修改的所有其他方法集合中的元素(即@SU
)。
答案 1 :(得分:1)
替换
public boolean remove(Object e)
通过
vector[K] x;
答案 2 :(得分:1)
如果你看一下java.util.ArrayList
,它有两种删除方法:
public boolean remove(Object o)
public boolean remove(int index)
您需要覆盖这些方法。此外,列表迭代器也可以删除元素,如果需要完全删除支持,则必须覆盖列表迭代器。
答案 3 :(得分:0)
覆盖方法时,签名必须相同。否则,你不会压倒一切。您只需转到List
实现并查看您尝试覆盖的方法即可。在您的情况下,它是remove
和add
。您会发现方法签名不会将Client
对象作为参数。相反,它需要Object
作为参数。
要覆盖,您必须维护方法签名。 Object
是所有java对象的超类,错误“必须覆盖或实现超类型方法”只是告诉您正在使用@Override
注释,而不实际覆盖任何内容。
答案 4 :(得分:0)
您可以将删除更改为对象,它将起作用,因为删除了一个对象。如果有人使用不同的方式添加对象,您将遇到问题。像addAll()或从集合构造函数创建一个ArrayList。
为了使用它而不是修改ArrayList方法,您可以将ArrayList扩展为“可以计算顺序的ArrayList”。类似的东西:
class ArrayListThatCalculatesTotalOrder extends ArrayList<Client>{
.... your private calcTotalOrder() methods is here ....
public TotalOrder getTotalOrder(){
calcTotalOrder();
return totalOrder;
}
}
通过这种方式,您可以自由地将其用作列表,但您也可以通过标准方式使用简单的getter获取计算的总订单。或类似的东西取决于你究竟需要什么。添加行为比修改现有行为更好。