В методе watchProgram
все, что знает Java, это то, что аргумент является InfoItem
. Этот аргумент может быть или не быть Item
, и, следовательно, он может иметь или не иметь этот метод changeRecorded
. Поскольку Java не может гарантировать, что объект имеет этот метод, она не может вставить код для вызова метода при компиляции класса. Что касается компилятора Java, метод changeRecorded
не существует в аргументе item
.
Обычно, когда вы сталкиваетесь с такой ситуацией, это признак того, что вам не следует вообще вызывать этот changeRecorded
метод. Тщательно продумайте, почему вы считаете, что вам это нужно, и как вы можете изменить свой собственный код для работы без его использования. Например, если кто-то вызовет ваш метод watchProgram
с другой реализацией InfoItem
, у которой нет метода changeRecorded
, что должен сделать watchProgram
?
Если после некоторого тщательного осмотра вы решите, что действительно необходимо для вызова метода changeRecorded
, когда переданный аргумент является экземпляром Item
, вы можете использовать приведите к этому:
watchProgram(InfoItem item) {
// do stuff
if (item instanceof Item) { // thanks to ruslan for if statement
Item castedItem = (Item)item;
castedItem.changeRecorded();
}
// do stuff
}
Но, как я уже сказал, подобные вещи следует использовать с осторожностью. Весь смысл объектно-ориентированного программирования (в частности, полиморфизма) состоит в том, чтобы сделать его таким, чтобы вы не должны были это делать.