Java列出多态性的问题

时间:2016-08-17 10:21:21

标签: java list polymorphism

我想用Java编写基于文本的游戏并遇到问题 我有一个HeadArmor对象extends Armor extends Itemimplements IEquipable
如果我向HeadArmor添加LinkedList对象并尝试访问它,则会成为Item对象。

private LinkedList<Item> items = new LinkedList<Item>();

我如何将Object从列表中取出的方法。

public Item getItemByName(String name) {            
    int i = 0;
    for (Item item : items) {
        if (item.getName().equals(name)) {
            //And the output is a Item Object and no HeadArmor
            System.out.println(items.get(i).getClass().getName());
            return items.get(i);
        }           
     i++;
    }
    return null;
}

因此我无法检查我的Object是否是HeadArmor的实例。

public boolean equip(String name){
        Item item = getItemByName(name);
        //here he prints out I AM A DieWeltvonZuul.Item CLASS
        System.out.println("I AM A "+item.getClass().getName()+ " CLASS");

        if(item instanceof Weapon){
            if (null != weapon) {
                items.add(weapon);
                weapon = (Weapon) item;
            }else{
                weapon = (Weapon) item;
            }
        }else{
            //here he won't enter even the Object was at the beginning of type HeadArmor and this Object extends Armor
            if (item instanceof Armor){
                changeItem((IEquippable) getItemByName(name));
            }else{
                return false;
            }
        }
        return true;
    }

如果我尝试将它投射到HeadArmor,我会得到

java.lang.ClassCastException: DieWeltvonZuul.Item cannot be cast to DieWeltvonZuul.HeadArmor

3 个答案:

答案 0 :(得分:2)

使用for (Item item : items)是一个不错的选择。那你为什么要用i?这毫无意义。

我不确定您想要实现的目标,但让我向您展示以下代码:

public Item getItemByName(String name) { 
    for (Item item : items) {
        if (item.getName().equals(name)) {
            if (item instanceof HeadArmor) {
                return item;
            }
        }
    }
    return null;
}

HeadArmor添加到List<Item>的{​​{1}}不会成为Item。它已经是Item了。每个HeadArmor都是ItemArmorHeadArmor。它也是Object。但是,List<Item>中的所有对象都保证为Items(和Object s),而不是其他任何对象。如果您想检查它们是Armor还是HeadArmor,则必须trycast。如果cast成功,则表示此特定iteminstance of HeadArmor

我认为您想要的可能如下:

Item i = getItemByName("helmet");
Header h = ((i == null) ? null : (HeadArmor)i);

答案 1 :(得分:2)

如果我使用此代码将项目添加到列表

items.add(new HeadArmor("helmet"));
items.add(new Armor("chain mail"));

尝试使用helmet方法检索getItemByName。输出将HeadArmor正如预期的那样。也许您在项目列表中创建和添加项目的方式存在问题?!

答案 2 :(得分:0)

您可以使用instanceOf方法检查项目是否为headArmor类型