Вызов защищенного метода из подкласса другого экземпляра различных пакетов


Я хочу вызвать защищенный метод другого экземпляра из подкласса класса, предоставляющего этот защищенный метод. См. следующий пример:

public class Nano {

    protected void computeSize() {
    }

}

public class NanoContainer extends Nano {

    protected ArrayList<Nano> children;

}

public class SomeOtherNode extends NanoContainer {

    // {Nano} Overrides

    protected void computeSize() {
        for (Nano child: children) {
            child.computeSize();            // << computeSize() has protected access in nanolay.Nano
        }
    }

}

javac говорит мне, что computeSize() has protected access in Nano. Я не вижу причины для этого (я думал, что уже делаю это в каком-то другом коде). Я хотел бы сохранить этот метод под защитой, что я могу сделать?

javac version "1.7.0_09"

Edit

Я хотел предоставить урезанную версию, но я не думал о том, что классы лежат в различный пакет.

nanolay.Node
nanolay.NanoContainer
nanogui.SomeOtherNode
2 4

2 ответа:

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

Пример, который у вас есть, находится в строках метода protected clone(), доступного в классе объектов в java; вы не можете напрямую вызвать его на любом объекте (хотя все объекты неявно расширяются из класса объектов).

Не знаю обоснования, но JLS подтверждает это в 6.6.2. Подробности о защищенном доступе (Курсив мой):

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

Итак:

package P2;
public class P2 {
    protected void foo() {}
}

.........

package P2A;    
class P2A extends P2.P2 {
    void bar(P2.P2 other) {
        this.foo(); // OK
        other.foo();  // ERROR
    }

    void bar2(P2A other) { 
        other.foo(); //OK
    }
}   

В P2A.bar вызов this.foo() доступен, потому что this отвечает за реализацию P2, но other.foo() не является доступно, потому что other не может быть P2A. bar2 с другой стороны есть P2A так что все хорошо.

Теперь, почему все в порядке, если все они-один и тот же пакет, но не если они-разные пакеты? В чем же причина? Я не знаю и хотел бы знать.

Мета-комментарий я откатил недавнее обновление другого пользователя, поскольку оно существенно изменяет ответ и, вероятно, более подходит в качестве ответа самого верхнего уровня.