Почему вы не можете уменьшить видимость метода в подклассе Java? - PullRequest
42 голосов
/ 21 октября 2009

Почему компилятор выдает сообщение об ошибке, когда вы уменьшаете видимость метода, переопределяя его в подклассе?

Ответы [ 3 ]

65 голосов
/ 21 октября 2009

Поскольку каждый экземпляр подкласса по-прежнему должен быть действительным экземпляром базового класса (см. Принцип подстановки Лискова ).

Если подкласс внезапно потерял одно свойство базового класса (например, открытый метод), то он больше не будет действительной заменой базового класса.

18 голосов
/ 21 октября 2009

Поскольку, если бы это было разрешено, возможна следующая ситуация:

Class Sub наследуется от класса Parent. Родитель имеет открытый метод foo, Sub делает этот метод закрытым. Теперь следующий код скомпилируется нормально, потому что объявленный тип bar является Parent:

Parent bar = new Sub();
bar.foo();

Однако не ясно, как это должно вести себя. Одна из возможностей - позволить этому вызвать ошибку во время выполнения. Другим было бы просто разрешить это, что позволило бы вызвать закрытый метод извне, просто приведя к родительскому классу. Ни одна из этих альтернатив не является приемлемой, поэтому она не допускается.

1 голос
/ 21 октября 2009

Поскольку подтипы должны использоваться как экземпляры их супертипа.

...