【问题标题】:Java dosen't recognize that object belongs to subclassJava 不承认该对象属于子类
【发布时间】:2018-03-28 12:33:00
【问题描述】:

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

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 类并采取相应措施,但我不知道哪里出了问题。任何帮助表示赞赏

【问题讨论】:

  • 武器类没有“回合”字段,因此您需要先将其施放为远程武器

标签: java inheritance abstract-class instanceof


【解决方案1】:

你的武器属于武器类。您必须将其转换为 RangedWeapon,以便您的编译器知道它是 RangedWeapon:

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

【讨论】:

    【解决方案2】:

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

    在编译阶段,编译器只知道WeaponWeapon不知道rounds

    您可以强制转换为RangedWeapon 以使其编译:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 您的解决方案无法编译,因为您试图将“回合”投射到远程武器(第一个错误)
      【解决方案4】:

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

      要开启RangedWeapon类的属性,你必须将其显式转换为RangedWeapon类:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-06
        • 1970-01-01
        • 2017-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多