Сопоставимый класс

Я некоторое время пытался изучить сопоставимый класс, я знаю правильный синтаксис и то, как он используется в большинстве случаев. Такие как:

int result = ObjectA.compareTo(ObjectB); 

вернет значение 0, если оба объекта одинаковы; отрицательное значение, если объект A меньше, чем объект B, или положительное значение, если A больше, чем B.

Однако, когда я собираюсь написать программу, использующую метод compareTo, компилятор говорит, что не может найти метод compareTo.

мой вопрос: нужно ли мне напрямую наследовать от класса Comparable, чтобы использовать метод compareTo? единственная причина, по которой я спрашиваю, заключается в том, что вам не нужно явно наследовать методы, такие как toString или equals... потому что все наследуется от объекта. Куда подпадает CompareTo?


person jo pizzamaker    schedule 14.03.2013    source источник
comment
Обратите внимание, что Comparable — это интерфейс, а не класс.   -  person pamphlet    schedule 15.03.2013
comment
Сейчас идет волна примерно из 15 ответов, все говорят одно и то же...   -  person Radu Murzea    schedule 15.03.2013


Ответы (5)


Вам нужно реализовать интерфейс Comparable:

public class MyClass implements Comparable<MyClass>

а затем объявите метод compareTo():

public int compareTo(MyClass myClass){
    //compare and return result
} 
person Jakub Zaverka    schedule 14.03.2013
comment
Ну, это имеет смысл, я приму ответ, как только он позволит мне. - person jo pizzamaker; 15.03.2013

Comparable — это интерфейс, а не класс. Таким образом, вы бы реализовали интерфейс, а не подкласс класса. Кроме того, реализация интерфейса означает самостоятельную реализацию метода compareTo в вашем реализующем классе.

person rgettman    schedule 14.03.2013

  1. Во-первых, это будет работать только в экземплярах. Не знаю, сравнивает ли ваше сравнение объекты или сами классы из-за вашего именования. Я предполагаю, что вы используете объекты :)
  2. Класс, который вы хотите сравнить с использованием #compareTo, ДОЛЖЕН реализовывать Comparable. Другой способ добиться этого без необходимости реализовывать Comparable — это предоставить вашему методу сортировки Comparator ожидающий ваш класс.
person Caesar Ralf    schedule 14.03.2013

Comparable — это интерфейс, поэтому вы не «наследуете» его (extends), а реализуете (implements).

Вы можете написать свой собственный метод compareTo в своем классе, не указывая интерфейс Comparable, но тогда методы в API не будут знать, соответствует ли ваш объект контракту, который обеспечивает Comparable. Таким образом, вы не сможете использовать такие методы, как Arrays.sort() и им подобные, которые должны работать с объектами, применяющими Comparable.

person SJuan76    schedule 14.03.2013

Если вы хотите, чтобы объекты вашего класса A сравнивались, возможно, потому, что вам нравится сортировать список этих объектов, вам нужно сделать так, чтобы класс A реализовывал Comparable интерфейс.

Как только класс A реализует Comparable, он должен реализовать и определить поведение compareTo, что, по сути, является тем, как вы хотите сравнить два объекта класса A.

Именно в этом методе вы можете решить, какие поля класса A участвуют в оценке меньшего или большего объекта.

person Community    schedule 14.03.2013