Эта строка:
o.print(); // error
Вы знаете, что o
- это на самом деле типа A
.
Компилятор может знать, но в Java он не знает.Компилятору известно только, что существует некоторая переменная с именем o
, типа Object
.
Таким образом, компилятор шлепает вас пальцами по поводу вызова метода для o
, который объявил тип Object
не поддерживает!
Другие языки "умнее" в таких вещах, но в Java так обстоит дело.