Java: не удается найти объект при использовании сопоставимого класса - PullRequest
0 голосов
/ 30 октября 2018

У меня есть две программы. один называется GeometricObject1, а другой называется Circle1, который расширяет Geometric Object1. Однако, когда я использую метод CompareTo и другой метод, который принимает 2 объекта из Comparable. компилятор выдает сообщение об ошибке "Cannot find symbol".

Я пытался поменять названия объектов, но, честно говоря, понятия не имею, что еще делать. Все имена методов взяты из скелета, которому мне сказали следовать, я просто остановился на последних двух методах, находящихся в круге 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 голосов
/ 30 октября 2018

Вы, вероятно, получаете ошибку компиляции здесь:

((GeometricObject1) o).compareTo(o1)

GeometricObject не реализует Comparable, поэтому этот метод там не существует.

Другой случай в вашем compareTo методе:

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

Объект o1 здесь не существует, поэтому компилятор не знает, на что вы ссылаетесь.

Существует ряд других проблем, которые я бы предложил решить с помощью вашего кода, но это конкретные ошибки, о которых вы спрашиваете. Похоже, GhostCat сделал более тщательный обзор кода, уже указав на эти проблемы.

0 голосов
/ 30 октября 2018

Этот раздел по-прежнему выдает сообщение об ошибке:

  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");
}
}
}
0 голосов
/ 30 октября 2018

Много вещей не так с вашим кодом. Ошибка проста:

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

Параметр называется o , но вы хотите использовать o1 . Не могу работать о не о1. Подсказка: используйте настоящие имена, которые имеют значение и намерение. Не называй это o, но otherCircle. Не называйте это o1 и o (как в вашем методе max, но, например, firstCircle и secondCircle). о и о1 действительно легко читать / писать неправильно. Настоящие имена ... действительно трудно использовать неправильно.

Тогда: вам не нужно сравнивать три раза вручную:

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

будет делать то, что вам нужно.

И: вы используете raw тип.

class Circle1 extends GeometricObject1 implements Comparable {

должно быть

класс Circle1 расширяет GeometricObject1 реализует Comparable {

и при этом правильной сигнатурой этого метода становится:

public int compareTo(Circle1 otherCircle) {

(так как вы опускаете из общего параметра, таким образом вам приходится иметь дело с Object и кастом)

Также обратите внимание: вы объявляете метод equals(), который не переопределяет базовый метод equals() из класса Object. Это может привести к всевозможным проблемам (вам нужно задать параметр типа Object, и вы должны поставить @Override перед любым методом, который вы хотите переопределить).

Наконец: ваш метод max также очень запутан. Не звоните compare() несколько раз, просто позвоните один раз и запомните результат этого звонка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...