Вызов защищенного метода из подкласса другого экземпляра различных пакетов
Я хочу вызвать защищенный метод другого экземпляра из подкласса класса, предоставляющего этот защищенный метод. См. следующий пример:
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 ответа:
Вы можете получить доступ к защищенным методам либо путем подклассов и переопределения; также, когда они доступны в том же пакете. Я добавлю некоторые детали. Вы можете прочитать подробности здесь.
Пример, который у вас есть, находится в строках метода
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
так что все хорошо.Теперь, почему все в порядке, если все они-один и тот же пакет, но не если они-разные пакеты? В чем же причина? Я не знаю и хотел бы знать.
Мета-комментарий я откатил недавнее обновление другого пользователя, поскольку оно существенно изменяет ответ и, вероятно, более подходит в качестве ответа самого верхнего уровня.