为啥需要布尔返回类型? [复制]

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&lt;ItemOrder&gt; 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&lt;String&gt; 类中的默认方法。

使用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.addArrayList.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>)差异? [复制]

为啥 all() 为空的可迭代对象返回 True? [复制]

为啥函数不能被返回类型重载? [复制]

在重载时为啥不考虑函数的返回类型? [复制]

为啥 C 函数不能返回数组类型? [复制]

为啥 c# 或 c++ 不能根据返回类型区分方法? [复制]