【发布时间】:2017-02-08 14:50:34
【问题描述】:
我有一个使用ItemOrder 对象的类ShoppingCart。
public class ShoppingCart extends ArrayList<ItemOrder> {
我有一个方法可以检查一个对象是否已经存在于数组列表中,如果存在则用新对象替换索引,如果不添加新对象。
public boolean add(ItemOrder order){
if (super.indexOf(order) != -1){ //ITEM ALREADY IN LIST, REPLACE
super.remove(super.indexOf(order));
super.set(super.indexOf(order), order);
}
else //ITEM NOT IN LIST, ADD
super.add(order);
return true; //TO SATISFY RETURN TYPE
}
当我编写方法时,我没有返回类型。我收到一个错误,提示我将返回类型设置为 void,所以我这样做了。然后我得到另一个错误,返回类型必须是布尔值。我唯一的问题是,该方法本身并不是(至少对我而言)真/假返回。我需要做的就是在 ArrayList 中添加/替换一个对象,根本不返回任何东西。
为什么这个方法需要一个布尔返回类型,我可以安全地在最后简单地抛出return true;,还是我真的应该有一些用处?
【问题讨论】:
-
您正在覆盖 List.add(),并让它做一些不尊重 List.add() 合同的事情。不要那样做。不要扩展 ArrayList。相反,使用 List 作为 ShoppingCart 的一个字段。 ShoppingCart 不是列表。不过,它可以使用列表来存储其元素。
-
不是您的问题,但是,如果您这样做
super.remove(super.indexOf(order));,那么以下语句super.set(super.indexOf(order), order);中的 indexOf 是什么? -
澄清一下:您正在重写该方法,因为它与this one 具有相同的名称和相同的参数类型。您试图给它一个不同的返回类型,但 Java 在决定一个方法是否覆盖另一个方法时不会查看返回类型。
-
@JeffreyDilley 如果您真的想要添加或覆盖并且实际上需要您当前正在做的事情(继承自
ArrayList而不是变量List<ItemOrder> listName就像 JBNizet 说的那样),而不仅仅是删除 @ 987654333@ 部分。 -
如果您想要一个不允许重复的列表,请尝试使用
Set。如果保留原始广告订单很重要,请使用LinkedHashSet。它比List.indexOf()逻辑快得多,并且您可以免费获得全部功能。无需覆盖。