2016-08-17 18 views
0

Javaでテキストベースのゲームを作成して問題があります。
私は、というオブジェクトを持っています。extends Armorは、extends Itemであり、これはimplements IEquipableです。
オブジェクトを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; 
    } 

私はfor (Item item : items)を使用し

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

であるかどうかを確認する方法instanceOfを使用することができます。 – xenteros

+1

アイテムにアクセスするために別のインデックスを使用している理由はありませんか?あなたはすでにあなたのfor-eachループに手元にある正しいアイテムを手に入れています... – dpr

+0

[mcve]を投稿した方がずっと簡単です – xenteros

答えて

2

を得るHeadArmorにキャストしようとした場合には良い選択です。なぜあなたはiを使用しますか?意味がない。私はあなたが達成したが、私はあなたに次のコードを表示させたいのかわからないんだけど

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

あなたHeadArmorList<Item>に追加はItemなりません。すでにItemです。各HeadArmorは、Item,ArmorおよびHeadArmorである。それはまたObjectです。ただし、List<Item>のすべてのオブジェクトはItems(およびObject秒)であることが保証されています。彼らがArmorHeadArmorであるかどうかを確認したい場合は、tryからcastにする必要があります。 castが成功した場合は、この特定の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

あなたはアイテムがロジックに問題がありますタイプheadArmor

関連する問題