метод compareTo (), выдававший ошибку «Этот метод должен возвращать int», несмотря на возвращение int в метод - PullRequest
1 голос
/ 13 марта 2020

Я работаю над заданием для моего курса по информатике, требующим от меня реализации интерфейса Comparable.

Мы не обсуждали интерфейс на любой длине, кроме того, что мне сказали, что он сравнивает два объекта и возвращает меньше, больше и равно, но буквально это все, что разочаровывает.

Я намерен провести больше исследований по этому вопросу, но сейчас я обнаруживаю, что не понимаю, почему моя реализация метода compareTo () не работает.

Eclipse выдает мне ошибку, что compareTo () должен вернуть int, но если вы заметите, я возвращаю целочисленное значение. Так в чем может быть проблема?

public int compareTo(Task taskToCompare) {
    if(this.complete && taskToCompare.isComplete()) {
        if(this.priority == taskToCompare.getPriority()) {
            return 0;
        }
        else if(this.priority < taskToCompare.getPriority()){
            return -1;
        }
        else if(this.priority > taskToCompare.getPriority()) {
            return 1;
        }
    } else if(this.complete == true && taskToCompare.isComplete() == false) {
        return -1;
    } else if(this.complete == false && taskToCompare.isComplete() == true) {
        return 1;
    }
}

Ответы [ 4 ]

8 голосов
/ 13 марта 2020

Если тип возврата int, вам придется вернуть int или throw исключение. Простой выход из метода без return приведет к ошибке компилятора.

Если у вас есть условие if-else-if, может случиться так, что ни один из блоков не будет вызван. Поэтому вы должны создать оператор else с return.

Кроме того, результат isComplete() и taskToCompare.getPriority() может измениться, если вы вызываете метод несколько раз. Компилятор не знает, предотвращает ли это ваша логика c.

Например, это тот случай, если complete равен false и isComplete() также возвращает false. Как и прежде, компилятор не знает, предотвращает ли это ваша логика c.

Я думаю, вы хотите что-то вроде:

public int compareTo(Task taskToCompare) {
    if(this.complete && taskToCompare.isComplete()) {
        if(this.priority == taskToCompare.getPriority()) {
            return 0;
        }
        else if(this.priority < taskToCompare.getPriority()){
            return -1;
        }
        else{
            return 1;
        }
    } else if(this.complete == true && taskToCompare.isComplete() == false) {
        return -1;
    } else if(this.complete == false && taskToCompare.isComplete() == true) {
        return 1;
    }else{
        return 0;
    }
}
3 голосов
/ 13 марта 2020

Что если this.complete == false и taskToCompare.isComplete() == false?

Компилятор жалуется, потому что вы не охватили каждый случай.

0 голосов
/ 13 марта 2020

более компактная версия:

public int compareTo(Task taskToCompare) {
        int completeCompare = (this.complete == taskToCompare.complete) ? 0 : (this.complete  ? 1 : -1);
        if(completeCompare==0) {
            return  this.priority-taskToCompare.getPriority();
        }
        return completeCompare;
    }
0 голосов
/ 13 марта 2020

Согласно сигнатуре вашего метода, вы должны вернуть значение int. Может быть случай, когда ни одно из условий, указанных в вашем коде, не оценивается как true, и в этом случае ваш метод не будет возвращать ничего, что противоречит сигнатуре метода.

Простой способ сделать это, чтобы присвоить возвращаемое значение переменной и вернуть переменную непосредственно перед выходом метода. Вы можете сделать это следующим образом:

public int compareTo(Task taskToCompare) {
    int value = 0;
    if(this.complete && taskToCompare.isComplete()) {
        if(this.priority == taskToCompare.getPriority()) {
            value = 0;
        }
        else if(this.priority < taskToCompare.getPriority()){
            value = -1;
        }
        else if(this.priority > taskToCompare.getPriority()) {
            value = 1;
        }
    } else if(this.complete == true && taskToCompare.isComplete() == false) {
        value = -1;
    } else if(this.complete == false && taskToCompare.isComplete() == true) {
        value = 1;
    }
    return value;
}
...