Comparable - это интерфейс, который позволяет сравнить объекты с соотвествии с натуральным порядком.
Списки или массивы объектов классов, реализующих данный интерфейс могут быть отсортированны автоматически с помощью соответсвующих статических функций Collections.sort() и Arrays.sort().
Интерфейс Comparable объявляет один единственный метод, который служит для определения натурального порядка экземпляров класса:
public interface Comparable<T> {
public int compareTo(T obj);
}
Этот метод сравнивает вызывающий объект с указанным в качестве входного параметра метода.
Метод compareTo() возвращает:
- отрицательное значение - если вызывающий объект имеет меньшее значение
- 0 - если объекты равны
- положительное значение - если вызывающий объект имеет большее значение
- consistent with equals - если объекты равны по функции compareTo(), то они должны быть также равны и по функции equals(). Это должно быть справедливо для любых двух объектов класса. Стоит принять во внимание, что null не является экземпляром ни одного класса, поэтому:
- compareTo(null) - должна выбрасывать NullPointerException
- equals(null) - должна возвращать false
Выполнение данного правила строго рекомендованно, хотя и не обязательно. Но в этом случаем не будет нарушен контракт для отсортированных наборов и карт, использующий естественное упорядочивание согласованное с равенством.
За исключением BigDecimal, все из перечисленных классов имеют натуральный порядок, который согласуются с равенством.
При попытке отсортировать список, набор используя Collections.sort(), элементы которого не реализуют Comparable интерфейс, будет ошибка компиляции:
Bound mismatch: The generic method sort(List<T>) of type Collections is not applicable for the arguments (List<Person>). The inferred type Person is not a valid substitute for the bounded parameter <T extends Comparable<? super T>>
При попытке отсортировать массив используя Arrays.sort(), элементы которого не реализуют Comparable интерфейс, будет выброшено ClassCastException исключение.
Отличие в том, что коллекции являются типизированными, а в случае с массивами используеся
Object[].
Комментариев нет:
Отправить комментарий