Как переопределить метод абстрактного внутреннего класса? - PullRequest
3 голосов
/ 08 декабря 2011

Мои коды:

core / Base.java

package core;
public class Base {
    public abstract class AbstractInner {
        abstract void run();
    }
}

Test.java

class Test extends core.Base {
    class Inner extends AbstractInner {
        void run() {}
    }
}

javac жалуется следующим образом:

shell> javac -cp . Test.java 
Test.java:2: Test.Inner is not abstract and does not override abstract method run() in core.Base.AbstractInner
    class Inner extends AbstractInner {
    ^

В чем моя ошибка?

Если Base находится в том же пакете, что и Test, компиляция прошла успешно.Я не знаю почему.

1 Ответ

5 голосов
/ 12 декабря 2011

Существуют некоторые неинтуитивные правила, регулирующие переопределяемость закрытых для пакета членов. По сути, вы можете переопределить закрытый для пакета метод, если переопределяющий класс находится в том же пакете. Если это не так, он не может видеть см. Объявление AbstractInner о run() и поэтому не может переопределить его. Вместо этого вы объявляете новый метод с той же подписью.

Если вы сделаете run() защищенным (или общедоступным) в AbstractInner (и, следовательно, также в Inner) вместо использования видимости по умолчанию, оно будет работать как задумано.

Напомним, что только в интерфейсах методы объявляются неявно public. В абстрактных классах они неявно закрыты для пакета.

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