所以我正在做一些关于制作小游戏原型的课程。我有这些简单的类(以及其他一些不相关的类):
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
并采取相应行动,但我不知道哪里出了问题。任何帮助表示赞赏
答案 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.weapon
是RangedWeapon
的一个实例,但其属性rounds
为hidden
,因为state.currentCharacter.weapon
位于Weapon
类型下。
要启用RangedWeapon
类的属性,您必须明确地将其强制转换为RangedWeapon
类:
RangedWeapon rangedWeapon = ((RangedWeapon) state.currentCharacter.weapon);
rangedWeapon.rounds +=10;