为啥需要布尔返回类型? [复制]
Posted
技术标签:
【中文标题】为啥需要布尔返回类型? [复制]【英文标题】:Why is Boolean return type required? [duplicate]为什么需要布尔返回类型? [复制] 【发布时间】: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()
逻辑快得多,并且您可以免费获得全部功能。无需覆盖。
【参考方案1】:
假设您有以下课程:
public class Example extends ArrayList<String>
public boolean add(String 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
添加方法public boolean add(String order)..
实际上是在覆盖它包含在ArrayList<String>
类中的默认方法。
使用IDE
,您可以清楚地看到您还需要@Override
注释,因此它将是:
@Override
public boolean add(String 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
你也可以看看 JavaDoc (https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html#add-int-E-)
【讨论】:
【参考方案2】:您的add
方法会覆盖实现Collection.add
的ArrayList.add
根据 javadoc Collection.add
如果集合因调用而改变,则返回 true
见:https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#add(E) 和https://docs.oracle.com/javase/7/docs/api/java/util/Collection.html#add(E)
【讨论】:
这就是我从 youtube 学习如何编码所得到的,哈哈。那么我需要包含覆盖注释吗?没有它的代码可以正常工作。另外,我可以安全地简单地返回 true 吗? 不,没有@override
注释你会没事的,但为了可维护性的目的,最好将其包含在内。至于return true;
,那么它现在可以为您工作,但是如果您的代码被一个期望ArrayList
的类使用并且当add()
失败或返回false
时它会执行某些操作,那么该类就会中断。因此,通常在覆盖时,您必须尊重被覆盖的方法协定:如果一切正常,则返回 true,否则返回 false。以上是关于为啥需要布尔返回类型? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
打字稿返回类型(布尔值 vs 'is' vs <nothing>)差异? [复制]