Как заставить этот метод поиска работать как для подклассов, так и для супер-класса?

Это часть класса, который называется игрок. findItem () — это метод, используемый для возврата элемента из HashMap «items».

public class Player extends Character {
    private String type;
    private int carryWeight;
    private HashMap<String, Item> items;


    public Item findItem(String search) {
        return this.items.get(search);
    }

До сих пор этот метод работал нормально.
Теперь у меня есть подкласс для элемента, называемого оружием.

public class Weapon extends Item{
    private int damage;

    public Weapon(String name, String description, String action, int value, int weight, int damage){
        super(name, description, action, value, weight);
        this.damage = damage;
     }

    public int getDamage(){
        return damage;
}

}

Я могу добавить оружие к элементам HashMap в Player, потому что оружие — это просто расширение элемента. Я также могу использовать findItem (), чтобы найти оружие в HashMap, но он возвращает его как элемент, а не оружие. Это делает его таким, что я не могу использовать метод getDamage() из подкласса оружия. Кто-нибудь видит быстрое решение моей проблемы? Im довольно уверен, что его что-то im отсутствует о наследовании.

Я пытался написать этот метод, но он говорит, что он не может преобразовать элемент в оружие:

public Weapon findWeapon(String search){
    for (Weapon weapon : items.values()){
        something somthing
     }
}

2 ответа

  1. Instanceof можно использовать для сортировки экземпляров оружия. Например:

    public Weapon findWeapon(String search){
      for (Item item : items.values()) {
        if(weapon instanceof Weapon) {
          Weapon weapon = (Weapon)item;
          <something somthing>
        }
      }
    }  
    
  2. В дополнение к тому, что ответ Марка Байдуэлла, вы можете сделать его более интересным, Enumкак это:

    public class Item {
    
        // ...
        // ...
        public enum ItemType {
            WEAPON, ARMOR, FOOD, ITEM;
        }
    
        public ItemType getItemType() {
            return ItemType.ITEM;
        }
    
    }
    
    class Weapon extends Item {
    
        private int damage;
    
        public Weapon(String name, String description, String action, int value, int weight, int damage) {
            super(name, description, action, value, weight);
            this.damage = damage;
        }
    
        public int getDamage() {
            return damage;
    
            @Override
            public ItemType getItemType () {
                return ItemType.WEAPON;
            }
    
    }
    
        // you can just cast like this
    public Weapon findWeapon(String search) {
        for (Item item : items.values()) {
            if (item.getItemType().equals(ItemType.WEAPON)) {
                Weapon weapon = (Weapon) item;
                // ...
            }
        }
        // ...
    }  
    

    Использование Enumдля проверки того, какой элемент также соответствует вашей логике игры, делает программу более надежной, и когда другие программисты используют ваш API, они точно знают, какие элементы есть, не глядя на ваш исходный код.