Java - 修改后的compareTo方法要求返回一个int,但它应该返回一个int。

5

我正在学习基础的Java知识,但是我的代码出现了问题,我无法解决。问题就是如标题所说,我的Java编译器提示我的自定义compareTo方法出错,说它需要返回一个int类型的值。但是问题是,据我所知,它确实返回了一个int类型的值。然而,它仍然给我报错。请问有人能指出我的代码哪里出了问题吗?我已经在我的类中实现了Comparable接口。这是我的方法:

public int compareTo(Homework other) {
    if (getDaysLate() < other.getDaysLate()) {
        return -1;
    } else if ((dateSubmitted == other.dateSubmitted)
            && (files.compareTo(other.files) == -1)) {
        return -1;
    } else if ((dateSubmitted == other.dateSubmitted)
            && (files == other.files)) {
        if (name.compareTo(other.name) == -1) {
            return -1;
        } else if (name.compareTo(other.name) == 1) {
            return 1;
        } else if (name.compareTo(other.name) == 0) {
            return 0;
        }
    } else {
        return 0;
    }
}
5个回答

2
第三个else中有一条路径没有返回任何内容。
 else if ((dateSubmitted == other.dateSubmitted) && (files == other.files)) {
    if (name.compareTo(other.name) == -1) {
      return -1;
    }
    else if (name.compareTo(other.name) == 1) {
      return 1;
    }
    else if (name.compareTo(other.name) == 0) {
      return 0;
    } else return ...
}

顺便说一句,我不确定我是否理解了您实现的逻辑,因为如果dateSubmitted!= other.dateSubmitted,则您将返回0。 compareTo也应该是反对称的(即sgn(x.compareTo(y))== -sgn(y.compareTo(x))),但您的实现不是。


@TedHopp 对的(谢谢,已修复)。我还纠正了反对称仅适用于结果的符号(两者都为零,或一个为正,另一个为负)。绝对值并不重要。 - Javier

1
您缺少这个分支后面的 else:
else if (name.compareTo(other.name) == 0) {
    return 0;
}

如果测试失败(compareTo 不返回 0),那么该方法将不得不在没有返回值的情况下退出,这在 Java 中是非法的。 此外,compareTo 可以返回任何整数值,而不仅仅是 0、1 和 -1。

1
你如何确保(有这么多的if和else)你总是返回一个int?对我来说似乎并不那么明显,显然编译器也同意我的看法。
解决这个问题的一种方法(可能不是最好的方法)是在函数末尾添加return -1; //或任何其他值

1
在你的第二个else-if语句中,你有一个可能不返回任何东西的代码路径。你说:
else if ((dateSubmitted == other.dateSubmitted) && (files == other.files)) {  
    if (name.compareTo(other.name) == -1) {  
        return -1;  
    }  
    else if (name.compareTo(other.name) == 1) {  
        return 1;  
    }  
    else if (name.compareTo(other.name) == 0) {  
       return 0;  
    }    

但如果所有的else if都不成立怎么办?尝试将第二个else if语句中的最后一个else-if改为else。


0
该方法应在所有代码流路径上返回适当的值;换句话说,在方法返回时的所有条件下都应如此。在以下的if块中,它没有在我标记的一个路径上返回。
   else if ((dateSubmitted == other.dateSubmitted) && (files == other.files)) {
        if (name.compareTo(other.name) == -1) {
        return -1;
        }
        else if (name.compareTo(other.name) == 1) {
        return 1;
        }
        else if (name.compareTo(other.name) == 0) {
        return 0;
        }
        // It should return something here, if none of the above "if" statements match.
        // Or one of the above "else if" should be changed to "else"
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接