将两个对象与同一父抽象类进行比较,输出为零

时间:2014-03-02 15:29:00

标签: java compareto

我有一个实现可比较的抽象类,具有以下内容:

public abstract class Figure  implements Comparable{

    protected double height ;

    public abstract double getArea();   

    public abstract double calculatevolume();//will be used later to compare the volume

    public int compareTo(Figure o) {
        return 0;

    }   
}

我有圆形和方形作为图的孩子但是当我尝试比较两个对象的体积时它总是返回0!

这是我在circle类中的compareTo方法:

public int compareTo(Object o) {

    Figure a = (Figure) o;

    if (this.calculatevolume() > ((Figure) o).calculatevolume())
        return (int)this.calculatevolume();
    else if (this.calculatevolume() < ((Figure) o).calculatevolume())
        return (int) a.calculatevolume();

    else

    return 0;
}

2 个答案:

答案 0 :(得分:0)

它应该更好,但首先请检查您可能返回0的方法calculatevolume天气的实施情况。

请为可比较的界面public abstract class Figure implements Comparable<Figure>

提供论据
Figure circle = new Circle();
Figure square = new Square();
circle.compareTo(square);



public int compareTo(Figure a) {
        if (this.calculatevolume() > a.calculatevolume())
            return (int)this.calculatevolume();
        else if (this.calculatevolume() < a.calculatevolume())
            return (int) a.calculatevolume();
        return 0;
    }

答案 1 :(得分:0)

您正在使用Comparable界面的原始版本

public abstract class Figure  implements Comparable{

换句话说,您尚未向Comparable提供类型参数。因此,它期望一个声明为

的方法
public int compareTo(Object o) {

但你的班级是abstract所以它不会抱怨。您提供的方法

public int compareTo(Figure o) {

Comparable完全无关。如果您使用@Override注释它,您会看到这一点。

在您的子课程中,您提供了

public int compareTo(Object o) {

这是预期的方法(它使paren'ts超载)。但不是你所呼唤的人。

您可能正在使用它

Figure one = ...
Figure two = ...

one.compareTo(two);

因为声明的two类型是Figure,所以它将使用父重载实现,它需要Figure,并且始终返回0.

解决方案是为Comparable提供适当的类型参数。

public abstract class Figure  implements Comparable<Figure>{

并从那里开始工作。