Java-compareTo и операторы

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

    personA < personB

заменить на

    personA.compareTo(personB) == -1? 

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

6 ответов


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

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


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

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

personA.compareTo(personB) == -1

to

personA.compareTo(personB) < 0

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


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

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


нет, "

personA.compareTo(personB)==-1

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

personA.compareTo(personB) < 0

вместо.


это не возможно, java не дает вам перегрузку оператора.
Но более OO вариант, чтобы добавить метод внутри человека

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

вместо того, чтобы писать

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

}

можно писать

if(personA.isTallerThan(personB)){

}

IMHO это более читабельно, потому что он скрывает детали и выражается на языке домена, а не специфику java.


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


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