2016-08-17 93 views
0

我想用Java编写基于文本的游戏,并且有问题。
我得到了一个HeadArmor对象extends Armorextends Item和这个implements IEquipable
如果我将HeadArmor对象添加到我的LinkedList并尝试访问它,它将成为Item对象。Java列出多态性问题

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

该方法如何让对象脱离列表。

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; 
} 

因此,我无法检查我的对象是否是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 
+1

没有与逻辑的问题。 – xenteros

+1

是否有任何非明显的原因,您为什么使用单独的索引来访问该项目。您在for-each循环中已经准备了正确的物品... – dpr

+0

如果您发布了[mcve] – xenteros

回答

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>不会成为Item。它已经是Item。每个HeadArmorItemArmorHeadArmor。这也是一个Object。但是,List<Item>中的所有对象都保证为Items(和Object),没有别的。如果你想检查它们是否也是ArmorHeadArmor你必须trycast。如果cast ing成功,则表示这个确定的iteminstance of HeadArmor

我假设你想要的东西可能是以下几点:

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

你不应该使用控制逻辑的异常处理,这是一种不好的编码习惯。改用'instanceof'。 –

+0

@PiotrWilkin你是对的。编辑。 – xenteros

+0

@PiotrWilkin复制我的答案建议? –

2

如果我用这个代码将项目添加到列表中

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

,并尝试以你的getItemByName方法检索helmet。如预期的那样,输出将是HeadArmor。也许有创建和添加项目到项目列表的方式有问题吗?!

0

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