Почему я не могу вызвать закрытый для пакета метод другого класса, который является подклассом класса в том же пакете? - PullRequest
0 голосов
/ 29 мая 2018

У меня есть класс Base в пакете A, который определяет приватный метод пакета foo().В пакете B у меня есть класс Impl, который расширяет Base.В пакете A, если я пытаюсь вызвать foo() на экземпляре Impl, я получаю ошибку компилятора.(Тем не менее, я могу привести Impl к Base и затем вызвать его.)

Представляется разумным, что я смогу вызвать foo() из пакета, даже если объектвызов его определяется вне пакета.Есть ли веская причина, по которой я не могу?

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Да, на то есть веская причина - package-private скрывает вашу реализацию и связывает реализацию с пакетом, которому принадлежит реализация.

Реализация A::foo() связана и доступна только из пакета A, в то время как реализация B:foo доступна только из пакета B.

То, что вы просите, можно транспонировать, если бы мы могли позволить любой частной реализации пакета быть доступной из пакетов каждого суперучебный класс;но это действительно увеличивает объем пакета private.Не говоря уже о том, что, поскольку все ваши классы наследуются от java.lang.Object, каждый закрытый метод пакета всегда будет доступен из пакета java.lang, что не имеет особого смысла!

0 голосов
/ 29 мая 2018

Вы дали ответ сами.Состояние «package private» метода foo () в классе A пакета A не заканчивается только потому, что вы расширяете этот класс.Пока расширяющий класс B является производным от другого пакета B, компилятор выдаст ошибку, если вы попытаетесь получить доступ к методу foo () в классе A пакета A.

Есть лихорошая причина, по которой я не могу?

Потому что это правило Java.

...