Java 如何正确重写ArrayList.remove()方法
我需要覆盖客户端的ArrayList中的add()和remove()方法 如果添加或删除客户机,列表中客户机的订单总数必须自动更新 实际上我有这样的东西:Java 如何正确重写ArrayList.remove()方法,java,arraylist,Java,Arraylist,我需要覆盖客户端的ArrayList中的add()和remove()方法 如果添加或删除客户机,列表中客户机的订单总数必须自动更新 实际上我有这样的东西: public class Path { private ArrayList<Client> clients = new ArrayList<Client>() { @Override public boolean add(Client e) { boolean allOk = super
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;
}
};
}
公共类路径{
私有ArrayList客户端=新ArrayList(){
@凌驾
公共布尔添加(客户端e){
布尔allOk=super.add(e);
如果(allOk)
calcTotalOrder();
返回allOk;
}
@凌驾
公共布尔删除(客户端e){
布尔allOk=super.remove(e);
如果(allOk)
calcTotalOrder();
返回allOk;
}
};
}
我在重写add()方法时没有问题,它实际上完全按照我所希望的方式工作,但与remove()的情况不同
我得到以下错误:“new ArrayList(){}类型的方法remove(Client)必须重写或实现超类型方法”
Eclipse的建议是消除@Override
我做错了什么?出于历史原因,
remove()
方法不是多态的,即它必须支持删除任意对象,而不是类型为T
的对象
但是,您必须记住还要重写相应的迭代器方法(因为调用remove()
并不是将内容添加到ArrayList
中的唯一方法),以及修改集合中元素的所有其他方法(即set()
)。Replace
public boolean remove(Client e)
借
如果查看java.util.ArrayList
,它有两个删除方法:
public boolean remove(Object o)
public boolean remove(int index)
您需要重写这些方法。此外,列表迭代器也可以删除元素,如果需要完全删除支持,则必须重写列表迭代器。重写方法时,签名必须相同。否则,您不会覆盖。您只需转到列表
实现,查看您试图覆盖的方法。在您的情况下,它是删除
和添加
。您会发现方法签名没有将客户机对象作为参数。相反,它将对象
作为参数
为了重写,您必须维护方法签名Object
是所有java对象的超类,错误“必须重写或实现超类型方法”只是告诉您正在使用@override
注释,而没有实际重写任何内容。您可以将该remove更改为Object,因为remove需要对象,所以它可以工作。不过,如果有人使用不同的方式添加对象,您将遇到问题。例如addAll()或从集合构造函数创建ArrayList
为了使用它,而不是修改ArrayList方法,您可以将ArrayList扩展为“ArrayList,它可以计算顺序”。比如:
class ArrayListThatCalculatesTotalOrder extends ArrayList<Client>{
.... your private calcTotalOrder() methods is here ....
public TotalOrder getTotalOrder(){
calcTotalOrder();
return totalOrder;
}
}
CalculatesTotalOrder类ArrayList扩展了ArrayList{
..您的私有calcTotalOrder()方法在这里。。。。
公共TotalOrder getTotalOrder(){
calcTotalOrder();
返回totalOrder;
}
}
通过这种方式,您可以自由地将其用作列表,但也可以通过一个简单的getter以标准方式获得计算出的总订单。或者类似的东西,取决于你到底需要什么。添加行为比修改现有行为更好。remove
不使用泛型,并接受对象
参数,方法的签名是公共布尔删除(Object obj)
。错误是因为ArrayList::remove
接受对象
。也就是说,您可能不想将ArrayList子类化;您可能希望改为委托给它,并让执行委托的方法中存在的代码calcTotalOrder
。@PM77-1-看起来ArrayList declarationremove(int index)中有一个代码块实际返回已删除的对象,而不是布尔值
class ArrayListThatCalculatesTotalOrder extends ArrayList<Client>{
.... your private calcTotalOrder() methods is here ....
public TotalOrder getTotalOrder(){
calcTotalOrder();
return totalOrder;
}
}