为什么比较返回整数
我最近在SO聊天中看到了一个讨论,但没有明确的结论,所以我最终问了那里。
这是由于历史原因还是与其他语言的一致性?查看各种语言的签名时,它会返回 .compareTo
int
为什么它不返回枚举。例如,在C#中,我们可以做到:
enum CompareResult {LessThan, Equals, GreaterThan};
和:
public CompareResult CompareTo(Employee other) {
if (this.Salary < other.Salary) {
return CompareResult.LessThan;
}
if (this.Salary == other.Salary){
return CompareResult.Equals;
}
return CompareResult.GreaterThan;
}
在Java中,枚举是在这个概念之后引入的(我不记得C#),但它可以通过一个额外的类来解决,例如:
public final class CompareResult {
public static final CompareResult LESS_THAN = new Compare();
public static final CompareResult EQUALS = new Compare();
public static final CompareResult GREATER_THAN = new Compare();
private CompareResult() {}
}
和
interface Comparable<T> {
Compare compareTo(T obj);
}
我之所以问这个问题,是因为我不认为 an 很好地代表了数据的语义。int
例如,在 C# 中,
l.Sort(delegate(int x, int y)
{
return Math.Min(x, y);
});
以及它在Java 8中的孪生兄弟,
l.sort(Integer::min);
编译两者,因为尊重比较器接口的合约(取两个 int 并返回一个 int)。Min/min
显然,这两种情况下的结果都不是预期的。如果返回类型是,它会导致编译错误,从而迫使您实现“正确”的行为(或者至少您知道自己在做什么)。Compare
这种返回类型会丢失很多语义(并且可能导致一些难以找到的错误),那么为什么要像这样设计它呢?