2016-08-17 2 views
0

자바로 텍스트 기반 게임을 작성하고 문제가 있습니다.
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 인 지 확인할 수 없습니다. 나는 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; 
    } 

나는

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

논리에 문제가 있습니다인지 여부를 확인하는 방법 instanceOf를 사용할 수 있습니다. – 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

Item가되지 않는 List<Item>에 추가 :

나는 당신이 달성하지만 내가 당신에게 다음 코드를 보여주게하려는 모르겠어요. 이미 Item입니다. 각 HeadArmorItem, ArmorHeadArmor입니다. Object입니다. 그러나 List<Item>의 모든 개체는 Items (및 Object 초)이며 다른 것은 보장되지 않습니다. Armor 또는 HeadArmor인지 확인하려면 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 여부