Компилятор не распознает, что я внедрил метод compareTo () из интерфейса, который он реализует

#java #interface #abstract-class #comparable

#java #интерфейс #абстрактный класс #сопоставимый

Вопрос:

Я реализую интерфейс ‘Comparable’ с помощью абстрактного класса AbstractAffiliate , который расширяется абстрактным классом Abstract Faculty, который расширяется обычным классом Assistant.

При реализации метода compareTo в классе assistant, который был объявлен во всех классах / интерфейсах выше, компилятор выдает эту ошибку.

Помощник.java: 1: ошибка: Помощник не является абстрактным и не переопределяет абстрактный метод compareTo() в общедоступном классе Abstract Faculty Помощник расширяет AbstractFaculty{ ^ 1 ошибка

Я попытался добавить в качестве обобщающего к сопоставимым реализациям.

Абстрактный партнер

 public abstract class AbstractAffiliate implements Printable, Comparable<AbstractAffiliate>{

protected String name;
protected int age;
protected String address;
protected int phoneNumber;
protected int yearTheyCameToChapman;

    /**
    * Default empty AbstractAffiliate constructor
    */
public AbstractAffiliate() {
    super();
  age = 0;
  address = " ";
  phoneNumber = 0;
  yearTheyCameToChapman = 0;
}

public AbstractAffiliate(String name, int age, String address, int phoneNumber, int yearTheyCameToChapman){
    this.name = name;
    this.age = age;
    this.address = address;
    this.phoneNumber = phoneNumber;
    this.yearTheyCameToChapman = yearTheyCameToChapman;
}

public abstract String print();

public abstract int compareTo();

}

  

Абстрактный факультет

 public abstract class AbstractFaculty extends AbstractAffiliate{

protected int facultyId;
protected String department;
protected int yearlySalary;
protected int numberOfPapers;

    /**
    * Default empty AbstractFaculty constructor
    */
public AbstractFaculty() {
    super();
  facultyId = 0;
  department = " ";
  yearlySalary = 0;
  numberOfPapers = 0;
}

    /**
    * Default AbstractFaculty constructor
    */
public AbstractFaculty(String name, int age, String address, int phoneNumber, int yearTheyCameToChapman, int facultyId, String department, int yearlySalary, int numberOfPapers) {
    super(name, age, address, phoneNumber, yearTheyCameToChapman);
    this.facultyId = facultyId;
    this.department = department;
    this.yearlySalary = yearlySalary;
    this.numberOfPapers = numberOfPapers;
    }

public abstract String print();

public abstract int compareTo();



}
  

Помощник

 public class Assistant extends AbstractFaculty{

private int yearsUntilTenure;

public Assistant(){
  super();
  yearsUntilTenure = 0;
}

public Assistant(String name, int age, String address, int phoneNumber, int yearTheyCameToChapman, int facultyId, String department, int yearlySalary, int numberOfPapers, int yearsUntilTenure){
  super(name, age, address, phoneNumber, yearTheyCameToChapman, facultyId, department, yearlySalary, numberOfPapers);
  this.yearsUntilTenure = yearsUntilTenure;
}

public String print(){
  return "yup";
}


public int compareTo(AbstractAffiliate affiliate){
  if (this.yearTheyCameToChapman < affiliate.yearTheyCameToChapman){
    return 1;
  }
  if (this.yearTheyCameToChapman > affiliate.yearTheyCameToChapman){
    return -1;
  }
  else{
    return 0;
  }
}



}
```[enter image description here][1]


  [1]: https://i.stack.imgur.com/Xdz2F.png
  

Комментарии:

1. public abstract int compareTo(); без параметра, с чем бы вы его сравнивали?

2. Возможно, я что-то пропустил, но вы объявили public abstract int compareTo(); в абстрактных классах, но вы реализовали, public int compareTo(AbstractAffiliate affiliate){... поэтому вам все еще нужно реализовать compareTo(); (или удалить его из абстрактных классов).

Ответ №1:

Вы не реализовали абстрактный метод. Абстрактный .compareTo() метод не принимает параметров. В отличие от этого, версия, которую вы реализовали в своем Assistant классе, принимает AbstractAffiliate в качестве параметра. Поскольку они имеют разные параметры, это делает их совершенно разными методами.

На первый взгляд, похоже, что версия, которая принимает параметр, является той, которую вы хотите, и об этом следует позаботиться, учитывая тот факт, что ваш базовый класс реализует Comparable<AbstractAffiliate> , поэтому просто полностью удалите свои абстрактные compareTo() методы, и все будет в порядке.

Комментарии:

1. Но опять же, этот абстрактный метод compareTo определен в сопоставимом интерфейсе, поэтому его не нужно объявлять снова.

2. @AndyTurner Хороший улов. Я не прокручивал код достаточно далеко вправо, чтобы заметить это. Глупый крошечный экран ноутбука.

3. оправдания оправдания: Я на своем телефоне 🙂

Ответ №2:

Сигнатура метода Comparable#compareTo выглядит следующим образом:

 public int compareTo(T o);
  

Но в Assistant и его родительском классе вы добавили абстрактный метод

 public abstract int compareTo();
  

Который отличается от метода из Comparable#compareTo . Просто удалите public abstract int compareTo(); метод из его родительских классов, это решит проблему, нет необходимости объявлять его снова и снова.

Ответ №3:

Это потому, что вы объявили о реализации Comparable<AbstractAffiliate> и не реализуете метод

 int compareTo(AbstractAffiliate o)
  

У вас другая подпись (без параметра)
Поскольку AbstractAffiliate и AbstractFaculty объявлены как абстракты, им не обязательно реализовывать метод из Comparable интерфейса. Классу Assistant необходимо.

Обратитесь к Comparable