Java, как наследовать методы от абстрактного класса - PullRequest
3 голосов
/ 30 ноября 2011

У меня есть абстрактный класс Person и сопоставимый интерфейс, который также используется для какой-то другой части программы. В настоящее время у меня есть метод compareTo () в Person. Когда я пытаюсь скомпилировать, я получаю:

The type Student must implement the inherited abstract method 
 Comparable<Person>.compareTo(Person, Person)

Что именно я должен сделать? Я не хочу реализовывать этот метод ни в одном из подклассов, потому что мне нужен этот метод для всех из них, студентов, преподавателей, профессоров и т. Д. ... Есть ли лучший способ сделать это?

Интерфейс:

interface Comparable<Element> {
    public int compareTo(Element nodeA, Element nodeB);
}

Абстрактный класс Персона:

abstract class Person implements Comparable<Person> {

    protected String name;

    public Person(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String newName) {
        name = newName;
    }
    public String toString() {
        return name;
    }

    public int compareTo(Person personB) {
        int comp = this.name.compareTo(personB.getName());
        return comp;
    }
}

И ученик класса

class Student extends Person implements Comparable<Person> {

    private int id;

    public Student(String name, int id) {
        super(name);
        this.id = id;
    }

    public int getID() {
        return id;
    }

    public void setID(int newID) {
        id = newID;
    }

    public String toString() {
        return id + ", " + name;
    }
}

Ответы [ 7 ]

2 голосов
/ 30 ноября 2011

Вы должны реализовать метод так, как он отображается в интерфейсе, то есть с двумя аргументами

public int compareTo(Person nodeA, Person nodeB)

Чтобы избежать подобных проблем в будущем, используйте аннотацию @Override:

@Override
public int compareTo(Person nodeA, Person nodeB)

Это приведет к ошибке компиляции, если вы попытаетесь переопределить метод, но допустите ошибку в его сигнатуре.

Также рассмотрите возможность использования стандарта Java Comparable .

2 голосов
/ 30 ноября 2011

Измените свой интерфейс с:

interface Comparable<Element> 
{     
   public int compareTo(Element nodeA, Element nodeB); 
}

на:

interface Comparable<Element> 
{     
   public int compareTo(Element nodeA); 
}

И сделайте свой класс Person следующим:

abstract class Person implements Comparable<? extends Person> { /* ... */ }

И сделайте своего ученика(и другие подклассы личности):

class Student extends Person { /* ... */ }

Вот и все.

2 голосов
/ 30 ноября 2011

Ваш сопоставимый интерфейс имеет метод compareTo(Element nodeA, Element nodeB). Этот метод не определен в Student и не определен в Person. Человек имеет следующий метод:

public int compareTo(Person personB)

, который не перекрывает compareTo(Person nodeA, Person nodeB)

Почему вы переопределяете стандартный интерфейс java.util.Comparable?

2 голосов
/ 30 ноября 2011

Ваш класс Comparable<Element> объявляет метод public int compareTo(Element nodeA, Element nodeB);, но в вашем классе Person вы реализуете public int compareTo(Person personB), который не является той же сигнатурой метода.

Вам необходимо либо реализовать public int compareTo(Person personA, Person personB) или измените определение метода вашего Comparable<Element> класса на public int compareTo(Element other);, чтобы переопределить ядро ​​Comparable класса compareTo метод .

Также, как @murat упоминает ниже в комментарииИспользование аннотации @Override поможет вам (при условии, что вы используете Java версии 1.5 или выше).Если вы добавите @Override к методу, который вы на самом деле не переопределяете из суперкласса (например, ваш метод compareTo с двумя аргументами), это будет ошибкой компилятора.

0 голосов
/ 30 ноября 2011
interface Comparable<Element> {
    public int compareTo(Element nodeA, Element nodeB);
}

Имеет смысл, если это было либо:

interface Comparator<Element> { //comparator compares two instances of same type
    public int compare(Element nodeA, Element nodeB);
}

или (должно быть что-то вроде этого для вашего случая):

interface Comparable<Element> { //comparable compares itself with another instance of same type
    public int compareTo(Element that);
}

Но в обоих случаях вы должны использовать стандартные интерфейсы Java: даже если вы используете только Comparable, см. Также Comparator.

0 голосов
/ 30 ноября 2011

Вам необходимо создать метод CompareTo в классе Student.

0 голосов
/ 30 ноября 2011

Вам нужно реализовать

public int compareTo(Person nodeA, Person nodeB)

В вашем Person классе.В настоящее время у вас есть только:

public int compareTo(Person personB)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...