¿Por qué no puedes reducir la visibilidad de un método en una subclase Java?

¿Por qué el comstackdor da un mensaje de error cuando reduce la visibilidad de un método al anularlo en la subclase?

Porque cada instancia de la subclase todavía necesita ser una instancia válida de la clase base (ver el principio de sustitución de Liskov ).

Si la subclase de repente ha perdido una propiedad de la clase base (es decir, un método público, por ejemplo), ya no sería un sustituto válido para la clase base.

Porque si esto estuviera permitido, la siguiente situación sería posible:

Class Sub hereda de la clase Parent. Parent tiene un método público foo , Sub hace que ese método sea privado. Ahora el siguiente código comstackría bien, porque el tipo de bar declarado es Parent:

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

Sin embargo, no está claro cómo debería comportarse esto. Una posibilidad sería dejar que cause un error de tiempo de ejecución. Otra sería simplemente permitirlo, lo que haría posible llamar a un método privado desde el exterior, simplemente transfiriéndolo a la clase padre. Ninguna de esas alternativas es aceptable, por lo que no está permitido.

Porque los subtipos deben ser utilizables como instancias de su supertipo.