Используйте метод, не определенный в Interface [Java] - PullRequest
0 голосов
/ 28 апреля 2010

У меня есть задание, и я получил библиотеку, включающую интерфейсный класс. [InfoItem]

Я реализую этот класс [Item].

Теперь мне нужно написать метод watchProgram (элемент InfoItem) [другой класс, импортирующий InfoItem], который (как показано) требует InfoItem.

Переданный элемент параметра имеет переменную 'Recorded' [boolean], которую я хочу редактировать с помощью метода changeRecorded (), который я определил в реализации InfoItem.

Я не могу редактировать интерфейс и получаю сообщение об ошибке, что метод не найден [не удается найти символ] ..

Любые советы, предложения, решения? Спасибо !!

-Samuel-

Ответы [ 3 ]

4 голосов
/ 28 апреля 2010

В методе 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
}

Но, как я уже сказал, подобные вещи следует использовать с осторожностью. Весь смысл объектно-ориентированного программирования (в частности, полиморфизма) состоит в том, чтобы сделать его таким, чтобы вы не должны были это делать.

1 голос
/ 28 апреля 2010
if (item instanceof Item) {
  ((Item)item).changeRecorded();
}

Однако имейте в виду, что это плохая практика, если ее можно избежать. Я хотел бы посмотреть, есть ли способ сделать то, что вы хотите, используя только методы, определенные в интерфейсе, возможно, сделав изменение побочным эффектом какого-либо другого метода.

Если то, что вы делаете, записывает факт того, что что-то было сделано с InfoItem, вы можете также рассмотреть возможность записи факта в другом месте, чем в объекте.

1 голос
/ 28 апреля 2010

Вы можете попробовать следующий трюк, который может быть вам полезен:

if (item instanceof Item) {
    Item myItem = (Item) item;
    myItem.changeRecorded();
}

Используйте этот код внутри вашего метода watchProgram ().

Здесь мы проверяем, является ли элемент параметратипа класса Item, а затем преобразовать его в этот тип и вызвать метод Item.changeRecorded ().

...