Java 从对象上调用方法';s类子类

Java 从对象上调用方法';s类子类,java,superclass,Java,Superclass,我试图从类武器调用一个方法,该类是项的子类。正如您从字段中看到的,我已将对象currentWearm声明为Item的对象,并且在setcurrentWearm方法中,我使用getClass()方法检查Item是否确实属于子类武器 有没有一种方法可以成功地从我的物品对象(实际上是武器类)的武器类调用方法 backpack是一个包含Item对象的hashmap。如果我在字段中将currentwearm设置为wearm,则wearm对象不会添加到背包中 无法编译的方法: (找不到符号-方法getMin

我试图从类
武器
调用一个方法,该类是
的子类。正如您从字段中看到的,我已将对象
currentWearm
声明为Item的对象,并且在
setcurrentWearm
方法中,我使用
getClass()
方法检查
Item
是否确实属于子类武器

有没有一种方法可以成功地从我的物品对象(实际上是武器类)的
武器
类调用方法

backpack
是一个包含
Item
对象的hashmap。如果我在字段中将
currentwearm
设置为
wearm
,则
wearm
对象不会添加到
背包中

无法编译的方法: (找不到符号-方法getMinDamage())

该领域:

private Item 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;
}

我希望这个问题不要太让人困惑,请给出如何澄清这是否是一个问题的提示

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

Weapon a; Item b;
if(a instanceof Weapon) returns true
if(b instanceof Weapon) returns false
然后,你可以简单地投下它

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

因此,
物品的武器实例
也是正确的


代码中出现错误的原因是,您正在对某个项目调用一个仅用于武器的函数;你首先需要检查你是否可以将物品施放到武器上,然后再施放

你的问题是当你打电话时

currentWeapon.getMinDamage()
当前武器
具有类型
。它的运行时类型是
武器
,但是您得到了一个编译时错误,因为它是错误的类型。如果希望字段保持
Item
类型,则需要在调用该方法之前将其强制转换为
武器
,以告诉编译器您希望它真正属于
武器

((Weapon)currentWeapon).getMinDamage()

您可以使用武器的
实例检查
项目的类型
,然后将
项目
投射到
武器

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

class Backpack {
    List<Weapon> weapons;
    List<Armor> armory;
    List<Provision> provisions;
    ...
}
class背包{
列出武器清单;
列出军械库;
列出规定;
...
}
然后重载
add
方法,以便将项添加到正确的集合中


如果您需要将背包中的所有物品视为通用的
Item
s(例如,如果您需要获得背包的总重量),那么这将使您能够灵活地循环浏览所有收藏,但是仍然保持不同类型的
项目
s分开以方便使用。

您的字段称为“Current武器”,但您给它一个类型项目而不是武器。。。无论什么能让你的船漂浮:)也许用抽象的方法…,这个问题不是很清楚…谢谢你对我的问题给出了很好的回答。信息量很大,解决方案非常有效。
class Backpack {
    List<Weapon> weapons;
    List<Armor> armory;
    List<Provision> provisions;
    ...
}