Сравнимая ошибка - PullRequest
       5

Сравнимая ошибка

1 голос
/ 30 марта 2012

Вопрос новичка здесь.Я пытаюсь учить себя, и иногда одиночный маршрут может быть неприятным.Я работаю над проблемой в книге Ляна «Введение в программирование на Java», 8-е издание (Упражнение 14.1), где мне нужно изменить класс GeometricObject для реализации Comparable, а затем определить статический метод «max», чтобы найти больший из двух объектов GeometricObject.Затем я должен написать тестовую программу, которая использует этот метод max, чтобы найти больший из двух прямоугольников.Ранее в книге автор велел создать подкласс Rectangle, расширяющий GeometricObject.Я изменил класс GeometricObject для реализации Comparable и создал метод max.Затем я изменил подкласс Rectangle, чтобы также реализовать Comparable.Я также написал тестовую программу.

Но Eclipse дает мне Big Red X, объявив класс моего Rectangle: «Сопоставимый интерфейс не может быть реализован более одного раза с разными аргументами: сопоставимыми и сопоставимыми».Вот когда объявление моего класса выглядит следующим образом:

public class Rectangle extends GeometricObject implements Comparable<Rectangle> {

Я попытался удалить параметр в целом:

public class Rectangle extends GeometricObject implements Comparable {

... и сообщение об ошибке меняется на «Comparable is rawtype. Ссылки на универсальный тип Comparable должны быть параметризованы. "Кроме того, в этом случае добавляется вторая ошибка: «Тип Rectangle должен реализовывать унаследованный абстрактный метод Comparable.compareTo (Object)»

Когда я смотрю на примеры такого рода объявлений, они, кажется, всегда используютимя класса как параметр для Comparable в объявлении, фактически, это то, что говорят книги.Так почему же здесь говорится, что я не могу этого сделать?

А что насчет второй ошибки, связанной с методом compareTo ()?Почему на это указывают только когда я удаляю параметр из объявления?Ниже приведен код для класса Rectangle (при необходимости я также могу опубликовать суперкласс GeometricObject):

public class Rectangle extends GeometricObject implements Comparable<Rectangle> {
private double width;
private double height;

public Rectangle() {
}

public Rectangle(double width, double height) {
    this.width = width;
    this.height = height;
}

public Rectangle(double width, double height, String color, boolean filled) {
    this.width = width;
    this.height = height;
    setColor(color);
    setFilled(filled);
}

public double getWidth() {
    return width;
}

public void setWidth(double width) {
    this.width = width;
}

public double getHeight() {
    return height;
}

public void setHeight(double height) {
    this.height = height;
}

public double getArea() {
    return width * height;
}

public double getPerimeter() {
    return 2 * (width + height);
}

/** Implement the compareTo method defined in Comparable */
public int compareTo(Rectangle o) {
    if (getArea() > ((Rectangle)o).getArea())
        return 1;
    else if (getArea() < ((Rectangle)o).getArea())
        return -1;
    else
        return 0;
}

}

Ответы [ 2 ]

0 голосов
/ 30 марта 2012

Да, это немного сложно и может сбить с толку.

Когда вы объявляете GeometricObject сопоставимым, это означает, что каждый GeometricObject можно сравнить с другим GeometricObject, так что вы можете отсортировать список GeometricObject (возможно, это будетбудь то экземпляры подклассов, потому что это, вероятно, будет абстрактно).Поэтому, когда вы реализуете Comparable в GeometricObject, вам нужно реализовать эту функцию:

public int compareTo(GeometricObject o) {}

в этой точке, когда расширение GeometricObject с помощью Rectangle-Rectangle автоматически выводит его суперкласс метод compareTo.и когда вы реализуете Comparable в Rectangle, вам нужно реализовать эту функцию:

public int compareTo(Rectangle o) {}

Кажется, что нет никаких проблем, потому что это похоже на обычную перегрузку, но вот подвох - Generics в Java это простосинтаксический сахар для компилятора - во время выполнения все generic становятся Object, поэтому после компиляции Rectangle будет содержать 2 одинаковых метода.

Таким образом, вы выбрали только один, хотя, если мы возьмем ваш вариант использования, это, вероятно, нормально- вы можете реализовать только Comparable в суперклассе, а в Rectangle переопределить его и проверить, является ли он экземпляром Rectangle, и выполнить свою конкретную логику или использовать логику суперкласса.

0 голосов
/ 30 марта 2012

Поскольку геометрический объект родительского класса уже реализует Comparable, вам не нужно снова реализовывать его в базовом классе 'Rectangle'.

Ваш базовый класс должен выглядеть следующим образом

public class Rectangle extends geometricObject { }

Так как geometryObject реализует Comparable, даже класс прямоугольника реализует Comparable.Вам просто нужно переопределить метод compareTo () в классе прямоугольника для сравнения с помощью метода max.

...