Java:使用可比较类时找不到对象

时间:2018-10-30 18:57:41

标签: java compiler-errors

我有两个程序。一个称为GeometricObject1,另一个称为Circle1,它扩展了Geometric Object1。但是,当我使用compareTo方法和另一个从Comparable获取2个对象的方法时。编译器将给出错误消息"Cannot find symbol"

我曾经尝试过切换对象的名称,但是老实说,我不知道还有其他事情要做。方法名称全部来自我被告知要遵循的框架,我只是停留在Circle 1内的最后两个方法上。

abstract class GeometricObject1 {

    protected String color;    
    protected double weight;

    // Default construct
    protected GeometricObject1() {
        color = "white";
        weight = 1.0;
    }

    // Construct a geometric object
    protected GeometricObject1(String color, double weight) {
        this.color = color;
        this.weight = weight;
    }

    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }

    public double getWeight() {
        return weight;
    }
    public void setWeight(double weight) {
        this.weight = weight;
    }

    //Write code here for Abstract method for area
    public abstract double findArea();

    //Write code here Abstract method for perimeter
    public abstract double findPerimeter();

}

//其他程序

class Circle1 extends GeometricObject1 implements Comparable {

    protected double radius;

    // Default constructor
    public Circle1() {
        this(1.0, "white", 1.0);
    }

    // Construct circle with specified radius
    public Circle1(double radius) {
        super("white", 1.0);
        this.radius = radius;
    }

    // Construct a circle with specified radius, weight, and color
    public Circle1(double radius, String color, double weight) {
        super(color, weight);
        this.radius = radius;
    }

    public static Circle1 max(Comparable o1, Comparable o) {
        if (((GeometricObject1) o).compareTo(o1) == 1) {
            System.out.println("The First Object is larger than the Second
                    Object");
        } else if (((GeometricObject1) o).compareTo(o1) == 0) {
            System.out.println("Both Object is equal");
        } else {
            System.out.println("The First Object is smaller than the Second");
        }
    }

    public double getRadius() {
        return radius;
    }
    public void setRadius(double radius) {
        this.radius = radius;
    }

    // Implement the findArea method defined in GeometricObject
    public double findArea() {
        return radius * radius * Math.PI;
    }

    // Implement the findPerimeter method defined in GeometricObject
    public double findPerimeter() {
        return 2 * radius * Math.PI;
    }

    public boolean equals(Circle1 circle) {
        return this.radius == circle.getRadius();
    }

    @Override
    public String toString() {
        return "[Circle] radius = " + radius;
    }

    @Override
    // Implement the compareTo method defined in Comparable
    public int compareTo(Object o) {
        if (findArea() == ((GeometricObject1) o1).findArea())
            return 0;
        else if (findArea() > ((GeometricObject1) o1).findArea())
            return 1;
        else
            return -1;
    }
}

3 个答案:

答案 0 :(得分:0)

您的代码有很多错误。错误很简单:

public int compareTo(Object o) {
    if (findArea() == ((GeometricObject1) o1).findArea())

该参数名为 o ,但是您想使用 o1 。不能工作o不是o1。提示:使用具有真实意义和意图的真实名称。不要称之为o,而是otherCircle。不要称其为o1o(例如在您的max方法中,但以firstCirclesecondCircle为例)。 o和o1确实很容易读/写错误。实名...真的很难以错误的方式使用。

然后:您不需要手动比较三遍:

return Double.compare(findArea(), ( (GeometricObject1) o1).findArea());

将做您所需要的。

并且:您正在使用原始类型。

class Circle1 extends GeometricObject1 implements Comparable {

应该是

Circle1类扩展了GeometricObject1实现了Comparable {

,这样做时,该方法的正确签名变为:

public int compareTo(Circle1 otherCircle) {

(由于您不使用通用参数,因此您必须处理Object并进行转换)

还请注意:您正在声明{strong>不会覆盖对象类的基础equals()方法的equals()方法。这可能会导致各种问题(您需要设置类型为Object的参数,并且应该将@Override放在要覆盖的 any 方法的前面)。

最后:您的max方法也非常令人困惑。不要重复调用compare(),只需调用一次即可,并记住该调用的结果。

答案 1 :(得分:0)

您可能会在这里遇到编译错误:

((GeometricObject1) o).compareTo(o1)

GeometricObject未实现Comparable,因此该方法在那里不存在。

您的compareTo方法中还有另一种情况:

public int compareTo(Object o) {
    if (findArea() == ((GeometricObject1) o1).findArea())

对象o1在这里不存在,因此编译器不知道您指的是什么。

我建议您使用代码解决许多其他问题,但这是您要询问的特定错误。看来GhostCat已经进行了更彻底的代码审查,指出了这些问题。

答案 2 :(得分:0)

此部分仍然会产生错误消息:

  Circle1.java:56: error: cannot find symbol
  else if (((GeometricObject1)o).compareTo(o1)==0){                               

  symbol:   method compareTo(Comparable)
  location: class GeometricObject1
  2 errors




if (((GeometricObject1)o).compareTo(o1)==1){
System.out.println("The First Object is larger than the Second 
Object");
}
else if (((GeometricObject1)o).compareTo(o1)==0){
System.out.println("Both Object is equal");
}
else {
System.out.println("The First Object is smaller than the 
Second");
}
}
}
相关问题