Java: доступ к наследуемым защищенным членам внутреннего класса - PullRequest
0 голосов
/ 13 декабря 2010

У меня есть класс CircularBuffer, который расширяет AbstractList.

У меня есть второй класс ExponentialUnrolledLinkedList, который имеет внутренний класс Node, расширяющий CircularBuffer.

Я могу получить доступ к некоторым защищенным элементам экземпляров Node в ExponentialUnrolledLinkedList (вне Node), даже если они объявлены вне Node (например, поле защищенного размера, объявленное в CircularBuffer), но не защищенное поле modCount, объявленное в AbstractList.

Я могу получить доступ к modCount из самого определения внутреннего класса, но не из включающего класса.

Например

public class ExponentialUnrolledLinkedList<E> extends AbstractSequentialList<E> {
     ...
     private Node last = new Node(1){
          protected int firstIndex(){
               return 0;
          }
     };

     private class Node extends CircularBuffer<E> {
          ...
          private void dirty(){
               this.modCount++; // works
          }
          protected int firstIndex(){
               return store.length;
          }
     }

     public int size(){
          return last.firstIndex() + last.size; // access to last.size works
     }

     public boolean add(E item){
          ...
          last.modCount++; // can't access modCount, have to call last.dirty()
          ...
          return true;
     }
}

Почему я могу получить доступ к размеру как во внутреннем классе, так и во внешнем классе, но я могу получить доступ только к modCount во внутреннем классе? У меня было (очевидно, ложное) впечатление, что внешние классы имеют доступ ко всему, к чему имеют доступ их внутренние классы. Очевидно, что некоторые защищенные члены доступны для обоих, но некоторые нет. У меня есть обходной путь, оборачивая инкремент modCount в (приватный) метод и вызывая этот метод, но это кажется не элегантным.

1 Ответ

0 голосов
/ 13 декабря 2010

Что такое видимость CircularBuffer.size? (Он не является членом AbstractList или его суперклассов).

Вы не можете получить доступ к CircularBuffer.modCount, потому что его видимость «защищена» в классе AbstractList. Это означает, что доступ к члену возможен только в его собственном пакете и подклассе его класса в другом пакете (например, CircularBuffer).

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