我有一个抽象类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;
}
}
答案 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
。