Проблемы с переопределением compareTo () в интерфейсе Comparable - PullRequest
2 голосов
/ 18 апреля 2019

Я работаю над программой, которая должна переопределить CompareTo () в Comparable, чтобы Collections.sort () работал. Поскольку я работаю с ArrayList, составленным из Assistants, который я должен отсортировать в зависимости от имени.

Я осмотрел форум и нашел это и попытался изменить

public class Assistant{

до

public class Assistant implements Comparable<Assistant>{

, что в свою очередь позволяет мне использовать Collections.sort () в другом классе и не предупреждает меня о каких-либо ошибках, однако появляются две новые ошибки.

Для начала, в этой же строке

public class Assistant implements Comparable<Assistant>{

он говорит мне, что «он не является абстрактным и не переопределяет CompareTo (Assistant) в Comparable». И когда я иду в CompareTo (), я создал:


    @Override
    public int compareTo(Object o2){
        Assistant m2 = (Assistant) o2;

        if(this.name.compareTo(m2.name) == 0){
            return 0;
        }else if(this.name.compareTo(m2.name)<0){
            return -1;
        }else{
            return 1;
        }
    }


(в конструкторе Ассистента есть только имя).

Однако в этом месте у меня есть ошибка в @Override: msgstr "метод не переопределяет или не реализует метод из супертипа".

А в следующей строке

    public int compareTo(Object o2){

Я получаю еще одну ошибку (которая связана с последней), говорящую мне: «Столкновение с именем: CompareTo (Object) в Assistant и CompareTo (Assistant) в Assistant имеют одинаковое стирание, но ни одно из них не перекрывает другое».

Я как бы понимаю проблему, я не переопределяю исходное сравнение to ().

Я новичок в Java, поэтому, если кто-то обнаружит проблему, я был бы признателен, если бы вы также объяснили, что я делаю неправильно (или отсутствует).

Спасибо:)

Ответы [ 4 ]

5 голосов
/ 18 апреля 2019

Это потому, что вы параметризовали Comparable (тип параметра Assistant). Это должно сделать это (я немного упростил это):

@Override
public int compareTo(Assistant o){
    return this.name.compareTo(o.name);
}
1 голос
/ 18 апреля 2019

К уже правильно изложенным примерам компиляции реализации я добавлю несколько правил, которые вы должны помнить в отношении переопределяющих методов:

  1. Чтобы переопределить метод, вам нужно использовать то же имя метода,
  2. ковариантный (обратно совместимый) тип возврата,
  3. тот же или более широкий тип доступа, но не более узкий.
  4. Однако список параметров должен отличаться.

Номер 4 объясняет, почему вам нужно изменить тип параметра с Object на Assistant, чтобы он успешно переопределил метод compareTo ().

1 голос
/ 18 апреля 2019

Это потому что иметь сопоставимый тип Assistant

Изменить

public int compareTo(Object o2)

К,

public int compareTo(Assistant o2)
1 голос
/ 18 апреля 2019

Поскольку вы реализуете Comparable, для вашего метода compareTo () требуется параметр типа Assistent.

Поэтому использование этого должно работать:

@Override
public int compareTo(Assistent m2) {

    if(this.name.compareTo(m2.name) == 0){
        return 0;
    }else if(this.name.compareTo(m2.name)<0){
        return -1;
    }else{
        return 1;
    }
}
...