Потому что классификация должна позволять вам думать о подклассах как об экземплярах их суперклассов.Я думаю, это называется отношением is-a
(а именно B is-a A
, но не наоборот).Я действительно не знаю хорошего способа объяснить это кратко.
В вашем примере все случаи B
также являются случаями A
(имейте в виду, что это может быть чрезмерным упрощением, но я думаю,для этого примера достаточно).A
гарантирует только общедоступные методы в своем собственном определении.B
просто делает один из защищенных методов public
, но давайте предположим, что у вас есть другой класс с именем C
, который этого не делал.Ну, вы можете преобразовать B
и C
в A
, но если вам было разрешено вызывать защищенный метод на A
, потому что B
делает его общедоступным, вы получите ошибку при передаче C
.
В другом пакете вы преобразуете B
в A
, поэтому ваш объект эффективно принимает интерфейс A
, поэтому вы можете использовать только тот интерфейс, который вам предоставлен.на A
.Может ли JVM справиться с проблемой и заметить, что 1) A
на самом деле B
и что 2) B
делает foo
общедоступным, поэтому foo
должно вызываться?Я имею в виду, могу ли я предположить, но сколько усилий потребуется для реализации в JVM и насколько это будет подвержено ошибкам?Будь проще.Если тип A
, то интерфейс A
.Если тип B
, то интерфейс A
и все остальное, что B
включает в себя.