B расширяет A, а в списке As некоторые индексы являются экземплярами B. Почему я не могу вызвать метод с index.Bmethod()?

У меня есть список предметов, и из этого списка я хочу извлечь предметы, которые являются оружием. Оружие расширяет Предметы, но имеет еще один метод: getBonus(), который дает игроку дополнительный урон.

Теперь я могу достаточно легко извлечь предметы, которые являются оружием, используя instanceof. Я прогоняю их через цикл for на основе индексов, и если это оружие, я его извлекаю. Однако я не могу вызвать метод оружия для этого элемента Item в списке, который, как я знаю, является оружием из-за instanceof, потому что он имеет тип «Предмет», а не «Оружие».

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

for(int i = 0; i < backpack.size(); i++) {
    if(backpack.get(i) instanceof Sword) {
    IItem item = backpack.get(i);
    backpack.remove(i);
    equipped = item;
    initialDmg += equipped.getBonus(); 
    checkInventory(game);
    game.formatMessage("You equipped a %s, and now hit for %d dmg!", item.getName(), getDamage());
    }
}

Линия

equipped.getBonus();

не работает, потому что оснащены типом IItem, а метод getBonus(); взят из интерфейса Weapons, который расширяет интерфейс IItem. Sword — это класс, реализующий интерфейс оружия.

Я хочу иметь возможность вызывать метод getBonus() из элементов, являющихся экземплярами оружия, но я не знаю, как это сделать с помощью этого цикла for?

Мне кажется, это потому, что список, который я просматриваю, состоит из IItem-элементов. Однако я не могу изменить его так, чтобы он состоял исключительно из элементов оружия, потому что в рюкзаке должны быть как обычные предметы, так и оружие. Как уже говорилось, некоторые элементы-Предметы являются Оружием.

Как я могу заставить элемент с индексом i использовать метод оружия, когда экземпляр оружия (в данном случае меч), ​​даже если это элемент типа Item?


person Jonas Norill    schedule 26.03.2019    source источник
comment
Вы должны привести элемент к Sword, чтобы использовать методы этого класса.   -  person Mike    schedule 26.03.2019
comment
Не забывайте также, что backpack.remove(i); удаляет элемент из списка, но вы также не уменьшаете i — это означает, что вы пропустите следующий элемент.   -  person Andy Turner    schedule 26.03.2019