Можно ли в Java вызывать защищенный метод класса-брата, где у элемента-брата параметры другого типа? - PullRequest
0 голосов
/ 25 сентября 2019

Учитывая следующий родительский класс:

public class AbstractParent<T> {
    abstract protected void doSomething();
}

и следующий дочерний класс:

public class DelegatingChildClass<T,U> extends AbstractParent<T> {
   AbstractParent<U> delegate;
   public DelegatingChildClass(AbstractParent<U> delegate) {
      this.delegate = delegate;
   }

   @Override
   protected void doSomething() {
      delegate.doSomething();//<--- Problem line
   }
}

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

  • классы в том же пакете, что и декларирующий класс
  • классы, расширяющие декларирующий класс

Поскольку DelegatingChildClass расширяет AbstractParent, я ожидаю, что метод doSomething () делегата будетбыть доступным.Однако компилятор жалуется на это, имея защищенный доступ.Это ошибка компилятора?Или я неправильно понимаю, как должен работать модификатор защищенного доступа?

1 Ответ

0 голосов
/ 28 сентября 2019

«классы, расширяющие объявляющий класс» означает, что у вас есть доступ к методам в суперклассе для того же объекта (this) по иерархии расширений для этого объекта.Объект типа DelegatingChildClass<T,U> также является объектом типа AbstractParent<T>, поэтому в коде для DelegatingChildClass<T,U> вы можете использовать методы AbstractParent<T> для того же объекта.Это позволило бы super.doSomething(), но здесь это не имеет смысла, потому что super.doSomething() равно abstract.

С delegate здесь невозможно вызвать doSomething(), потому что объект типа DelegatingChildClass<T,U> не расширяет объект в переменной delegate здесь.Этот вид использования называется составом, а не расширением.

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