Java: доступ к унаследованным защищенным членам внутреннего класса

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

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

Я могу получить доступ к некоторым защищенным членам экземпляров Node в ExponentialUnrolledLinkedList (вне Node), даже если они объявлены вне Node (например, защищенное поле size, объявленное в 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 в (частный) метод и вызывающий этот метод, но это кажется неэлегантным.


person Nick    schedule 13.12.2010    source источник


Ответы (1)


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

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

person Kurt Kaylor    schedule 13.12.2010
comment
CircularBuffer.size защищен и объявлен в CircularBuffer. Вы упомянули, что защита также подразумевает доступ на уровне пакета (по умолчанию). Я не знал об этом. Это объясняет, почему я могу получить доступ к CircularBuffer.size в ExponentialUnrolledLinkedList. это не потому, что у меня есть внутренний класс, производный от CircularBuffer, а потому, что CircularBuffer и ExponentialUnrolledLinkedList находятся в одном пакете. Я предполагаю, что то, к чему может получить доступ внешний класс, не имеет ничего общего с тем, к чему могут получить доступ его внутренние классы. - person Nick; 13.12.2010