我有两个程序。一个称为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;
}
}
答案 0 :(得分:0)
您的代码有很多错误。错误很简单:
public int compareTo(Object o) {
if (findArea() == ((GeometricObject1) o1).findArea())
该参数名为 o ,但是您想使用 o1 。不能工作o不是o1。提示:使用具有真实意义和意图的真实名称。不要称之为o,而是otherCircle
。不要称其为o1
和o
(例如在您的max方法中,但以firstCircle
和secondCircle
为例)。 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");
}
}
}