Java不会认识到该对象属于子类

时间:2018-03-28 12:33:01

标签: java inheritance abstract-class instanceof

所以我正在做一些关于制作小游戏原型的课程。我有这些简单的类(以及其他一些不相关的类):

abstract class Weapon {
    int damage;
    int cost; 
}

abstract class RangedWeapon extends Weapon {
    int range;
    int rounds;
}

class ExtraRounds extends Item{
    int cost = 20;
    int uses = 1;
    void use(GameState state){
        if (state.currentCharacter.weapon instanceof RangedWeapon){
            state.currentCharacter.weapon.rounds += 10;
        }
    }

}

但是在尝试编译时我得到了

Implementations.java:56: error: cannot find symbol
            state.currentCharacter.weapon.rounds += 10;
                                         ^
  symbol:   variable rounds
  location: variable weapon of type Weapon

我想要的只是班级ExtraRounds来检查weapon是否属于班级RangedWeapon并采取相应行动,但我不知道哪里出了问题。任何帮助表示赞赏

4 个答案:

答案 0 :(得分:5)

你的武器属于武器类。你必须把它投射到RangedWeapon,以便你的编译器知道它是一个RangedWeapon:

if (state.currentCharacter.weapon instanceof RangedWeapon){
   ((RangedWeapon)state.currentCharacter.weapon).rounds += 10;
}

答案 1 :(得分:4)

您似乎将state.currentCharacter.weapon声明为Weapon,然后尝试访问其rounds字段。

在编译阶段,编译器只知道它是Weapon,而Weapon没有rounds

您可以强制转换为RangedWeapon以进行编译:

if (state.currentCharacter.weapon instanceof RangedWeapon){
    RangedWeapon rangedWeapon = (RangedWeapon)state.currentCharacter.weapon;
    rangedWeapon.rounds += 10;
}

答案 2 :(得分:0)

在检查是否具有该类型后,您必须将 state.currentCharacter.weapon 强制转换为 RangedWeapon

RangedWeapon rangedWeapon = (RangedWeapon) state.currentCharacter.weapon;
rangedWeapon.rounds +=10;

答案 3 :(得分:0)

state.currentCharacter.weaponRangedWeapon的一个实例,但其属性roundshidden,因为state.currentCharacter.weapon位于Weapon类型下。

要启用RangedWeapon类的属性,您必须明确地将其强制转换为RangedWeapon类:

RangedWeapon rangedWeapon = ((RangedWeapon) state.currentCharacter.weapon);
rangedWeapon.rounds +=10;