Скручивание
Сложности с Music.java можно видеть при запуске этой программы. Вывод в Wind.play( ). Причем это почти желаемый вывод, но здесь не должно играть роли, как это будет проигрываться. Посмотрите на метод tune( ):
public static void tune(Instrument i) { // ...
i.play(Note.MIDDLE_C); }
Метод воспринимает ссылку на Instrument. А как компилятору узнать, что в действительности эта ссылка на Instrument
указывает на Wind в этом случае и не указывает на Brass или Stringed? Компилятор не может. Для того, что бы поглубже разобраться в этом затруднении неплохо было бы разобраться и в самой сущности связывания.