Допустимо ли вызывать абстрактный метод на суперклассе в Java - PullRequest
4 голосов
/ 15 февраля 2011

.. а если так, каково поведение?Я сталкивался с этим в каком-то коде, который я недавно просматривал, и он меня очень смущаетУ меня нет Java-компилятора, поэтому я не могу легко ответить на этот вопрос.Вот грубый пример того, о чем я говорю.Я ожидаю, что это приведет к ошибке компиляции, но, насколько я знаю, это из рабочей базы кода.

abstract class Base {
    ...
    abstract boolean foo(String arg);

}

class Sub extends Base {
    ...
    boolean foo(String arg) {
        if(condition) 
            return true;
        else 
            return super.foo(arg); //<-- <boggle/>
    }
}

Ответы [ 5 ]

16 голосов
/ 15 февраля 2011

Нет, если в суперклассе оно абстрактное, его нельзя назвать. Попытка скомпилировать ваш код (исправив остальные) приводит к этой ошибке:

Test.java:13: abstract method foo(String) in Base cannot be accessed directly
            return super.foo(arg); //<-- <boggle/>
                        ^
6 голосов
/ 23 января 2014

Когда вы ставите «супер». перед именем метода вы говорите компилятору: «Эй, чувак! вызвать метод, реализованный именно в базовом классе ». На самом деле его там не существует, поэтому он не может быть вызван и компилятор жалуется. Просто удалите «супер». и оставьте 'foo (arg);' только. Это скажет компилятору искать реализацию в некотором подклассе.

Кстати, если условие в вашем примере всегда ложно, оно попадет в бесконечный цикл и аварийно завершится из-за нехватки памяти:)

Ура, ~ R

3 голосов
/ 15 февраля 2011

Это не скомпилируется. Вы не можете вызвать абстрактный метод.

2 голосов
/ 23 января 2014

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

2 голосов
/ 15 февраля 2011

Вставка вашего примера в Eclipse и его редактирование так, чтобы он фактически компилировал, что приводит к этой ошибке:

"Невозможно напрямую вызвать абстрактный метод foo (String) для типа Base"

Вы уверены, что это происходит из "рабочей кодовой базы?"

...