Java - сравнить и операторы - PullRequest
       31

Java - сравнить и операторы

8 голосов
/ 20 января 2012

Если у меня есть класс Person, который реализует Comparable (сравнивает, например, personA.height с personB.height), можно ли использовать

    personA < personB

в качестве замены

    personA.compareTo(personB) == -1? 

Есть ли какие-либо проблемы в этом или мне нужно перегрузить операторы?

Ответы [ 6 ]

14 голосов
/ 20 января 2012

Нет, невозможно использовать personA < personB в качестве замены. И вы не можете перегружать операторы в Java.

Кроме того, я бы рекомендовал изменить

personA.compareTo(personB) == -1

до

personA.compareTo(personB) < 0

То, что у вас есть сейчас, вероятно, работает для вашего класса. Однако контракт на compareTo() заключается в том, что он возвращает отрицательное значение , когда personA меньше personB. Это отрицательное значение не должно быть -1, и ваш код может сломаться, если используется с другим классом. Он также может сломаться, если кто-то изменит метод compareTo() вашего класса на другую, но все же совместимую реализацию.

6 голосов
/ 20 января 2012

В Java нет перегрузки операторов.Вы, вероятно, пришли из C ++ фона.

Вы должны использовать метод compareTo.

5 голосов
/ 20 января 2012

Это невозможно, нет; а Java не поддерживает перегрузки операторов (кроме встроенных перегрузок).

Кстати, вместо записи == -1, вы должны написать < 0. compareTo требуется только для возврата отрицательного / нулевого / положительного значения, а не конкретно -1 / 0 / 1.

1 голос
/ 20 января 2012

Это невозможно, Java не дает вам перегрузки оператора.
Но более ОО вариант - добавить метод внутри человека

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

поэтому вместо написания

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

}

Вы можете написать

if(personA.isTallerThan(personB)){

}

ИМХО, он более читабелен, потому что скрывает детали и выражается в языке предметной области, а не в спецификациях java.

1 голос
/ 20 января 2012

Нет, «<» не будет компилироваться применительно к объектам.Кроме того, будьте осторожны с тестом: </p>

personA.compareTo(personB)==-1

Документы API просто говорят, что compareTo () возвращает отрицательное целое число, когда объект меньше указанного объекта, который не обязательно будет равен -1.Вместо этого используйте

personA.compareTo(personB) < 0

.

1 голос
/ 20 января 2012

В Java нет перегрузки операторов 1 , так что да, есть проблема: это невозможно.


1 Есть, конечно, несколько встроенных перегрузок: оператор + работает с целочисленными типами, типами с плавающей точкой и с String s. Но вы не можете определить свой собственный.

...