#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