我的类不会覆盖抽象方法compareTo

时间:2017-12-07 04:11:48

标签: java abstract-class compareto

我的班级详述了市中心餐馆的属性,所述属性是x / y位置和等级。问题是,每当我运行程序时它会抛出一个错误,说非抽象类" Downtown"不会覆盖抽象方法" compareTo"。我不能使这个类抽象,因为我需要初始化这个代码块之外的对象。我的程序在哪里出错了?我的compareTo实现有问题吗?任何建议将不胜感激。

public class Downtown implements Comparable<Downtown> {//Throws error on this line
    private int x;
    private int y;
    private int rank;

    public Downtown(int x, int y, int rank) {
        this.x = x;
        this.y = y;
        this.rank = rank;
    }
    //Appropriate setters and getters for x , y and rank
    public int getX() {
         return x;
    }
    public void setX(int x) {
    this.x = x;
    }
    public int getY() {
    return y;
    }
    public void setY(int y) {
    this.y = y;
    }
    public int getRank() {
    return rank;
    }
    public void setRank(int rank) {
    this.rank = rank;
    }   

    public int compareTo(Downtown p1, Downtown p2)//Actual comparison
    {
        // This is so that the sort goes x first, y second and rank last

        // First by x- stop if this gives a result.
        int xResult = Integer.compare(p1.getX(),p1.getX());
        if (xResult != 0)
        {
            return xResult;
        }

        // Next by y
        int yResult = Integer.compare(p1.getY(),p2.getY());
        if (yResult != 0)
        {
            return yResult;
        }

        // Finally by rank
        return Integer.compare(p1.getRank(),p2.getRank());
    }

    @Override
    public String toString() {
        return "["+x+' '+y+' '+rank+' '+"]";
    }

2 个答案:

答案 0 :(得分:2)

Java的Comparable<T>接口定义compareTo方法如下:

int compareTo(T o);

这意味着该方法必须采用一个参数;另一个参数是对象本身,即this。你需要实现这个单参数方法来代替你的双参数方法来解决这个问题。

编译器将通过在您的方法上使用@Override annotation来帮助您解决此类问题:

@Override // Issues an error
public int compareTo(Downtown p1, Downtown p2)

@Override // Compiles fine
public int compareTo(Downtown other)

答案 1 :(得分:1)

compareTo方法应将当前对象(this)与一个其他对象进行比较。它不应该有两个参数进行比较。你可以写这样的方法。

public int compareTo(Downtown p2)//Actual comparison
{
    // This is so that the sort goes x first, y second and rank last

    // First by x- stop if this gives a result.
    int xResult = Integer.compare(getX(),p2.getX());
    if (xResult != 0)
    {
        return xResult;
    }

    // Next by y
    int yResult = Integer.compare(getY(),p2.getY());
    if (yResult != 0)
    {
        return yResult;
    }

    // Finally by rank
    return Integer.compare(getRank(),p2.getRank());
}

请注意我如何将p1上的所有调用替换为当前对象上的调用。