Java,如何从抽象类继承方法

时间:2011-11-29 22:14:55

标签: java inheritance methods abstract

我有一个抽象类Person和接口可比,它也用于程序的其他部分。目前我在Person中有一个方法compareTo()。当我尝试编译时,我得到:

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 个答案:

答案 0 :(得分:2)

您的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 method

另外,正如@murat在评论中提到的那样,使用@Override注释会帮助你(假设你使用的是Java 1.5或更高版本)。如果将@Override添加到一个实际上没有覆盖超类的方法(例如你的双参数compareTo方法),那么这将是编译器错误。

答案 1 :(得分:2)

您的Comparable界面有compareTo(Element nodeA, Element nodeB)方法。此方法未在Student中定义,也未在Person中定义。人有以下方法:

public int compareTo(Person personB)

,不会覆盖compareTo(Person nodeA, Person nodeB)

为什么要重新定义标准java.util.Comparable界面?

答案 2 :(得分:2)

您应该实现界面中显示的方法,即使用两个参数

public int compareTo(Person nodeA, Person nodeB)

为了避免将来出现此类问题,请使用@Override注释:

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

如果您尝试覆盖某个方法,但在签名时出错,则会导致编译错误。

另外,请考虑使用Java的标准Comparable

答案 3 :(得分:2)

从以下位置更改您的界面:

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 { /* ... */ }

就是这样。

答案 4 :(得分:0)

您需要实施

public int compareTo(Person nodeA, Person nodeB)

Person课程中。目前你只有:

public int compareTo(Person personB)

答案 5 :(得分:0)

您需要在Student类中创建compareTo方法。

答案 6 :(得分:0)

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