我正在尝试从类Weapon
调用一个方法,该类是Item
的子类。正如您在字段中看到的那样,我已将对象currentWeapon
声明为Item的对象,并在setCurrentWeapon
方法中使用getClass()
方法检查Item
实际上是武器的子类。
有没有办法可以在我的Item对象(实际上是Weapon类)中成功调用Weapon
类中的方法?
backpack
是一个包含Item
个对象的散列图。如果我在字段中将currentWeapon
设置为Weapon
,则Weapon
对象将不会添加到backpack
。
无法编译的方法: (找不到符号 - 方法getMinDamage())
public int attack(Imperial currentEnemy) {
int damage = Utils.random(currentWeapon.getMinDamage(), currentWeapon.getMaxDamage()+1);
currentEnemy.changeHealth(-damage);
return damage;
}
字段:
private Item currentWeapon;
设置currentWeapon的方法:
public boolean setCurrentWeapon(String itemToEquip) {
if(useItem(itemToEquip) == true) {
currentWeapon = backpack.get(itemToEquip.toLowerCase());
if(currentWeapon.getClass() == Weapon.class) {
System.out.println(getNick() + " has equipped " + currentWeapon.getName() + " as current weapon");
equipped = true;
return true;
}
else {
System.out.println(itemToEquip + " is not a weapon");
currentWeapon = null;
return false;
}
}
else System.out.println(itemToEquip + " is not owned by " + getNick());
return false;
}
我希望这个问题不会太混乱,请提供一些如何澄清问题的提示
答案 0 :(得分:4)
你的问题是,当你打电话
currentWeapon.getMinDamage()
currentWeapon
的类型为Item
。它的运行时类型是Weapon
,但是你得到一个关于它是错误类型的编译时错误。如果您希望该字段保持Item
类型,则需要在调用该方法之前将其强制转换为Weapon
,以告诉编译器您希望它实际上属于{{1}类型}:
Weapon
答案 1 :(得分:2)
您可以使用Item
检查instanceof Weapon
的类型,然后将Item
投放到Weapon
。
为Backpack
设计一个更好的设计可能是让它成为一个包含不同类型库存的不同集合的类。例如,您可以:
class Backpack {
List<Weapon> weapons;
List<Armor> armory;
List<Provision> provisions;
...
}
然后重载add
方法,以便将项目添加到正确的集合中。
如果您需要将背包中的所有物品视为通用Item
(例如,如果您需要获得背包的总重量),那么这将使您可以灵活地遍历所有集合),但为方便起见,仍然将不同类型的Item
分开。
答案 2 :(得分:1)
您可以使用instanceof
检查某些内容是否是某个类的实例。在这种情况下,您可以使用:
Weapon a; Item b;
if(a instanceof Weapon) returns true
if(b instanceof Weapon) returns false
然后,你可以简单地施展它。
instanceof
检查第一个参数中的对象是否属于第二个参数的类型,因此可以安全地在第二个参数中强制转换该类型。因此,如果一个物品是武器,它必须专门作为武器实例化。
因此,Weapon instanceof Item
也是如此。
代码中出错的原因是你在Item上调用了Weapon-only函数;你首先需要检查你是否可以将物品投射到武器,然后施放它。