9

如果我有一个Person实现的类Comparable(例如,与 相比personA.heightpersonB.height,是否可以使用

    personA < personB

作为替代品

    personA.compareTo(personB) == -1? 

这样做有什么问题还是我需要重载运算符?

4

6 回答 6

15

不,不可能personA < personB用作替代品。而且你不能在 Java 中重载运算符。

另外,我建议更改

personA.compareTo(personB) == -1

personA.compareTo(personB) < 0

你现在拥有的可能对你的班级有用。但是,合约 oncompareTo()是它在小于时返回负值。该负值不必为 -1,如果与不同的类一起使用,您的代码可能会中断。如果有人将您的类的方法更改为不同的——但仍然兼容的——实现,它也可能会中断。personApersonBcompareTo()

于 2012-01-20T18:26:59.867 回答
6

Java 中没有运算符重载。您可能来自 C++ 背景。

你必须使用compareTo方法。

于 2012-01-20T18:27:07.593 回答
5

这是不可能的,不;并且 Java 不支持运算符重载(除了内置重载)。

顺便说一句,== -1你应该写而不是写< 0compareTo只需要返回负/零/正值,而不是-1/0/1。

于 2012-01-20T18:28:16.233 回答
2

这是不可能的,java 不会给你操作符重载。
但是更多的 OO 选项是在 person 内部添加一个方法

public boolean isTallerThan(Person anotherPerson){
    return this.compareTo(anotherPerson) > 0;
}

所以而不是写

if(personA.compareTo(personB) > 0){

}

你可以写

if(personA.isTallerThan(personB)){

}

恕我直言,它更具可读性,因为它隐藏了细节,并且用领域语言而不是 java 细节来表达。

于 2012-01-20T18:48:54.177 回答
1

Java 没有运算符重载1,所以,是的,有一个问题:这是不可能的。


1当然,有一些内置的重载:+运算符适用于整数类型、浮点类型和Strings。但是你不能定义你自己的。

于 2012-01-20T18:27:21.767 回答
1

不,“<”应用于对象时不会编译。另外,请注意您的测试:

personA.compareTo(personB)==-1

API 文档只是说当对象小于指定对象时 compareTo() 返回一个负整数,不一定是-1。采用

personA.compareTo(personB) < 0

反而。

于 2012-01-20T18:35:39.360 回答