class A {
private int foo;
void bar(B b) { b.foo = 42; }
}
class B extends A { }
Это не скомпилируется с ошибкой:
A.java:3: error: foo has private access in A
void bar(B b) { b.foo = 42; }
^
1 error
Добавление приведения в базовый класс заставляет его работать.
void bar(B b) { ((A) b).foo = 42; }
Может кто-нибудь указать мне на объяснение, почему первый фрагмент является незаконным? Какая причина, по которой это запрещено? Здесь JLS говорит:
В противном случае член или конструктор объявляется
private
, и доступ разрешен тогда и только тогда, когда он встречается внутри тела класса верхнего уровня (§7.6), который включает объявление члена или конструктора.
Насколько я могу судить, мой код соответствует этой формулировке. Так это ошибка с компилятором Java, или моя интерпретация JLS неверна?
(Примечание: я не ищу обходные методы, например, сделать переменную protected
. Я знаю, как обойти это.)