Item是带有子类Potion, Weapon. Shield的抽象类。

useItem()方法是在每个Item's子类中定义的抽象方法

get_itemItem的返回对象

getItem方法返回Item的子类的对象

case "use":
    if (hero.get_item() instanceof Potion) {
        hero.<Potion>getItem(Potion.class).useItem();

    } else if (hero.get_item() instanceof Weapon) {
        hero.<Weapon>getItem(Weapon.class).useItem();

    } else if (hero.get_item() instanceof Shield) {
        hero.<Shield>getItem(Shield.class).useItem();
    }
    break;


有没有一种方法可以将这段代码压缩为类似...

Class itemclass = hero.getItem().getClass();
hero.<itemclass>getItem(itemclass.class).useItem();


上面的代码无法编译,但是我正在寻找类似的东西。我试图避免使用if else语句,因为还有更多项目。

编辑:

我最初不使用hero.get_item().useItem()的原因是
我试图做

Weapon sword = hero.get_item();


这样我就可以访问诸如sword.getDamage()之类的方法

但是,我会得到错误error: incompatible types: Item cannot be converted to a Weapon

所以这就是为什么我创建了(来自@marsouf的帮助)hero.<Weapon>getItem(Weapon.class)

今天,我创建了方法abstract public void useItem();
并且由于它是Item类的方法,因此我可以使用hero.getItem().useItem()

最佳答案

使用方法InterfaceItem避开useItem()会更有意义。

然后为PotionShield等实现。

这样,您就不必进行强制转换并使它变得比实际复杂。

如果useItem()没有提供任何功能,则它不属于抽象类,并且现在不需要的接口也可以具有default方法。

10-04 19:03