Вопрос новичка здесь. Я пытаюсь учить себя, и иногда одиночный маршрут может разочаровывать. Я работаю над проблемой в книге Ляна «Введение в программирование на Java», 8-е издание (упражнение 14.1), где мне нужно изменить класс GeometricObject для реализации Comparable, а затем определить статический метод «max», чтобы найти больший из двух GeometricObjects. Затем я должен написать тестовую программу, которая использует этот метод max для нахождения большего из двух прямоугольников. Ранее в книге автор предлагал нам создать подкласс Rectangle, расширяющий класс GeometricObject. Я изменил класс GeometricObject для реализации Comparable и создал метод max. Затем я изменил подкласс Rectangle, чтобы он также реализовывал Comparable. Я также написал тестовую программу.
Но Eclipse дает мне большой красный крестик в объявлении моего класса Rectangle, в котором говорится: «Интерфейс Comparable не может быть реализован более одного раза с разными аргументами: Comparable и Comparable». Вот когда мое объявление класса выглядит так:
public class Rectangle extends GeometricObject implements Comparable<Rectangle> {
Я попытался полностью удалить параметр:
public class Rectangle extends GeometricObject implements Comparable {
... и сообщение об ошибке меняется на «Comparable — необработанный тип. Ссылки на универсальный тип 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;
}
}
GeometricObject
? Я думаю, что идея заключается в том, что вы реализуетеComparable
только в целом на самомGeometricObject
таким образом, чтобы все подклассы также работали. - person mellamokb   schedule 30.03.2012