2

我正在尝试从该类中调用一个方法,该类WeaponItem. 从字段中可以看出,我已将该对象声明currentWeapon为 Item 的对象,并且在setCurrentWeapon方法中我使用getClass()方法来检查它Item是否真的是子类 Weapon。

有没有一种方法可以成功地从Weapon我的 Item 对象(实际上是 Weapon 类)的类中调用方法?

backpack是一个包含Item对象的哈希图。如果我在字段中设置currentWeapon为 a ,则该对象不会添加到.WeaponWeaponbackpack

编译失败的方法:(找不到符号 - 方法 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;
}

我希望这个问题不会太令人困惑,请提供有关如何澄清这是否是问题的提示

4

3 回答 3

4

你的问题是,当你打电话

currentWeapon.getMinDamage()

currentWeapon有类型Item。它的运行时类型是Weapon,但是您会收到关于它是错误类型的编译时错误。如果您希望该字段保持 type Item,则需要Weapon在调用该方法之前将其强制转换为 a ,以告诉编译器您希望它确实是 type Weapon

((Weapon)currentWeapon).getMinDamage()
于 2013-04-10T16:14:44.550 回答
2

您可以检查 with 的类型,Item然后instanceof Weapon将其强制Item转换为 a Weapon

对您来说更好的设计Backpack可能是使其成为一个包含不同类型库存的不同集合的类。例如,您可以:

class Backpack {
    List<Weapon> weapons;
    List<Armor> armory;
    List<Provision> provisions;
    ...
}

然后重载一个add方法,以便将项目添加到正确的集合中。

Item如果您需要将背包中的所有物品都视为通用的(例如,如果您需要获取背包的总重量),这将使您可以灵活地循环遍历所有集合,但仍保留不同类型的Item为方便起见分开。

于 2013-04-10T16:22:14.707 回答
1

您可以使用它instanceof来检查某物是否是类的实例。在这种情况下,您可以使用:

Weapon a; Item b;
if(a instanceof Weapon) returns true
if(b instanceof Weapon) returns false

然后,您可以简单地投射它。

instanceof检查第一个参数中的对象是否属于第二个参数的类型,因此可以安全地转换为第二个参数中的类型。因此,如果一个项目是武器,它必须被具体实例化为武器。

因此,Weapon instanceof Item也应如此。

代码中出现错误的原因是您正在对 Item 调用 Wea​​pon-only 函数;您首先需要检查是否可以将物品施放为武器,然后再施放。

于 2013-04-10T16:11:42.600 回答