我想用Java编写基于文本的游戏并遇到问题
我有一个HeadArmor
对象extends Armor
extends Item
和implements 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
答案 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
都是Item
,Armor
和HeadArmor
。它也是Object
。但是,List<Item>
中的所有对象都保证为Items
(和Object
s),而不是其他任何对象。如果您想检查它们是Armor
还是HeadArmor
,则必须try
到cast
。如果cast
成功,则表示此特定item
为instance 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
类型