Класс не является абстрактным и не переопределяет ошибку абстрактного метода … хотя он реализует метод

#java #class #interface #overriding

#java #класс #интерфейс #переопределение

Вопрос:

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

в настоящее время это выглядит так:

 interface Shape {
    String getShapeName();

    double getField();
}

class Circle implements Shape {
    String name;
    double r;

    public Circle(String name, double r) {
        this.name = name;
        this.r = r;
    }

    @Override
    public double getField(double r) {
        return Math.PI * Math.pow(r, 2);
    }

    @Override
    public String getShapeName() {
        return this.name;
    }
}

class Square implements Shape {
    String name;
    double a;

    public Square(String name, double a) {
        this.name = name;
        this.a = a;
    }

    @Override
    public double getField(double a) {
        return Math.pow(a, 2);
    }

    @Override
    public String getShapeName() {
        return this.name;
    }
}

class Triangle implements Shape {
    String name;
    double a;
    double b;
    double c;

    public Triangle(String name, double a, double b, double c) {
        this.name = name;
        this.a = a;
        this.b = b;
        this.c = c;
    }

    @Override
    public double getField(double a, double b, double c) {
        double p = (a   b   c) / 2;
        return Math.sqrt(p * (p - a) * (p - b) * (p - c));
    }

    @Override
    public String getShapeName() {
        return this.name;
    }
}
  

И я понятия не имею, почему… Я видел, что этот вопрос задавался несколько раз, но в большинстве случаев это было результатом не реализации некоторых методов из интерфейса (или неправильного ввода имени метода, которые не являются моими случаями, поскольку методы интерфейса были скопированы во все 3 класса…

Комментарии:

1. double getField(); и double getField(double r); это не одно и то же.

2. Форма не импортируется, а создается (и ДА — данная проблема ТРЕБУЕТ создания собственного интерфейса формы). И почему они не совпадают — разрушает ли добавление конструктора (расширение реализованного метода)?

3. Нет, у метода есть сигнатура , которая идентифицирует метод. Сигнатура — это имя плюс список типов параметров. Если метод имеет то же имя, но разные типы параметров, он считается другим методом. Метод с тем же именем, но с другим введенным параметром называется перегрузкой .

Ответ №1:

У вас есть:

 interface Shape {
    String getShapeName();
    double getField();
}
  

однако вы явно указываете в своих подклассах, что вы переопределяете:

 @Override
public double getField(double r) {...}
  

double getField() и double getField(double r) это не одно и то же.

Переопределение и скрытие методов:

Метод экземпляра в подклассе с той же сигнатурой (имя, плюс номер и тип его параметров) и типом возвращаемого значения, что и метод экземпляра в суперклассе, переопределяет метод суперкласса.

Примечание: @Override (которое является @Retention(SOURCE) ) аннотацией поверх вашего метода, заставляет вас переопределять соответствующий метод, иначе вы не сможете скомпилировать свой файл.