Метод переопределения проблем из сопоставимого интерфейса - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть абстрактный класс с именем Individuo, который реализует интерфейс Comparable<Individuo>.Тем не менее, когда я пытаюсь переопределить метод в дочерних классах, он реализует следующий метод:

@Override
public int compareTo(Object o) {
    return 0;
}

Разве он не должен реализовывать следующее?

@Override
public int compareTo(Individuo o) {
    return 0;
}

Вот объявления

Индивидуальный:

public abstract class Individuo<I extends Individuo> implements Cloneable, Comparable<Individuo>

Индивидуальный_MultiOOP (дочерний):

public class Individuo_MultiOOP extends Individuo implements Cloneable

Ответы [ 4 ]

0 голосов
/ 25 сентября 2018
@Override
public int compareTo(Individuo o) {
    return 0;
}

Это метод, который необходимо переопределить, если вы указали универсальный тип.Я имею в виду, когда ваша сигнатура класса:

открытый класс Individualiduo реализует Comparable

Но если вы не указали универсальный тип сопоставимого интерфейса, это нормальнопереопределить метод public int compareTo (Object o) .Я имею в виду, что в случае, если ваша подпись класса:

открытый класс Enididuo реализует Comparable

Дайте мне знать, если ваша проблема решена, брат

0 голосов
/ 25 сентября 2018

Нет, вы должны переопределить с тем же аргументом.Это будет более читабельным и понятным.

class Individuo implements Comparable<Individuo>{
    @Override
    public int compareTo(Individuo o) {
        return 0;
    }
}

Дочерний класс

public class Child extends Individuo{
    @Override
    public int compareTo(Individuo o) {
        // TODO Auto-generated method stub
        return 0;
    }
}

Если вы используете Object, дизайн может стать проблемой.

0 голосов
/ 25 сентября 2018

Вероятно, что потомки расширяют необработанную версию Individuo, которая обобщается некоторыми аргументами.

В этом случае compareTo(Object o) у потомков скомпилируется:

abstract class Individuo<T> implements Comparable<Individuo<T>> {}

class Child extends Individuo {
    @Override
    public int compareTo(Object o) {
        return 0;
    }
}

Убедитесь, что дети расширяют правильный Individuo со всеми предоставленными общими параметрами:

class Child extends Individuo<Child> {
    @Override
    public int compareTo(Object o) { // this shouldn't compile
        return 0;
    }
}
0 голосов
/ 25 сентября 2018

Редактировать 2 (после обновления вопроса)

Поскольку Individualid объявлен с универсальным типом, поэтому используйте Comparable<Individuo<I>>
вместо Comparable<Individuo> в объявлении.

Оригинальный ответ
Сначала сохраните класс с объявлением реализации без переопределения compareTo() -

public class IndividuoChild extends Individuo {
...
}

Затем из сообщения об ошибке компилятора [может бытьнаходится в таких средах разработки, как eclipse, intellij], выберите «Добавить невыполненные методы» , что приведет к ожидаемому compareTo() как -

@Override
public int compareTo(Individuo o) {
    // TODO Auto-generated method stub
    return 0;
}
...