Java 无法将类别A强制转换为类别B

Java 无法将类别A强制转换为类别B,java,oop,Java,Oop,从Minotaur实例访问字段level的正确方法是什么? (inti=0;i

Minotaur
实例访问字段
level
的正确方法是什么? (inti=0;i<((怪物)this.level;i++)的
中出现错误,该
不能从玩家向怪物施放

package player;

import monsters.*;

public class Player extends GameCharacter {

      public void performAttackOn(GameCharacter who){

    if (who instanceof Monster ){

        for (int i =0 ; i < ((Monster) this).level ; i++) { // << 

                 }

    public static  class Minotaur extends Monster{ // << nested class which is being created and there is need to access it's level

        public Minotaur () {

              type = "Minotaur";

        }
    }

}



Minotaur
应该扩展
monsters.GameCharacter
monsters.Monster
并在
Player.Player
中覆盖
monsters.GameCharacter

继承自
monsters.GameCharacter的一些方法,这些方法有
GameCharacter
接口定义
getLevel()
怪物
和玩家
都实施的方法

public interface GameCharacter
{
  public int getLevel( );
}
一旦你做到了这一点,你就可以利用,甚至不需要施展


另外,你真的想把
玩家类型的
这个
施放到
怪物类型的
上吗?或者你的意思是:

public void performAttackOn(GameCharacter who)
{
    for (int i =0 ; i < who.getLevel( ) ; i++)
    {
      // do stuff...
    }
}
public void performAttackOn(游戏角色who)
{
for(inti=0;i
编辑:现在我明白了,您不能对类的字段进行继承。你应该有一个共同的方法

pubic int level();
在您的
游戏角色中
。然后,您可以选择是将
level
定义为子类的两个不同字段(不推荐),还是让
GameCharacter
有一个level字段

这里:
((怪物)this).level
您正在将
实例投射到
怪物
。这就是为什么你会出错

也许你的意思是:

if (who instanceof Monster ){
  for (int i =0 ; i < ((Monster) who).level ; i++) { // << 

  }
}
if(谁是怪物的实例){

对于(inti=0;i<((怪物)who.level;i++){/在您定义的层次结构中,
玩家
永远不可能是
怪物
,因此无法施放角色

根据上面的检查,我认为您遇到问题的那一行应该是
,而不是
这个

for(int i = 0; i < ((Monster)who).level; i++)
for(inti=0;i<((怪物)who).级别;i++)

这很简单。你检查
谁是蒙特勒,但如果是,你将
这个
投射到莫斯特,这个
指的是你现在所在的对象,它意味着某个玩家。替换这个

((怪物)这个)。等级

用这个

((怪物)谁)。等级


错误应该会消失。

很简单,你不会。玩家是游戏角色,而不是怪物。所以玩家不会正确地向怪物施放。
if (who instanceof Monster ){
  for (int i =0 ; i < ((Monster) who).level ; i++) { // << 

  }
}
for(int i = 0; i < ((Monster)who).level; i++)