Java:ClassCastException;将玩家等级转换为扩展玩家的等级

Java:ClassCastException;将玩家等级转换为扩展玩家的等级,java,object,classcastexception,Java,Object,Classcastexception,我很难理解如何解决在我的在线多人游戏中创建一个扩展玩家类的机器人的问题 如果我尝试创建扩展Player的类(NPC_Type1、NPC_Type2等),我希望能够注册扩展类而不是Player,因为每个类都会做一些不同的事情 仅将其转换为正确的类型会产生错误: 演员示例: NPC_Type1 p = (NPC_Type1)registerPlayer(null) java.lang.ClassCastException:类 com.testgame.server.model.player.pla

我很难理解如何解决在我的在线多人游戏中创建一个扩展玩家类的机器人的问题

如果我尝试创建扩展Player的类(NPC_Type1、NPC_Type2等),我希望能够注册扩展类而不是Player,因为每个类都会做一些不同的事情

仅将其转换为正确的类型会产生错误:

演员示例:

NPC_Type1 p = (NPC_Type1)registerPlayer(null)
java.lang.ClassCastException:类 com.testgame.server.model.player.player不能强制转换为类 com.testgame.server.model.player.NPC_Type1 (com.testgame.server.model.player.player和 com.testgame.server.model.player.NPC_Type1位于的未命名模块中 加载程序“应用程序”)

PlayerManager代码:


 private List<Player> players = new ArrayList<>(); // keep track of players in game (maybe bots to?)

 public Player registerPlayer(Channel c) { //netty channel
        Player player = new Player(context, c);
        if ((!player.isBot())) // bots are exempt
        {
            //do stuff
            return player;
        }
        players.add(player); // add player to list
 }

 public Player createBot(
        String name,
        int ID,
        int[] startPosition,
        float startDamage
    ) {
        Player p = registerPlayer(null); //cast error here
        p.register(
                name,
                ID,
                startPosition,
                startDamage,
        );
        return p;
    }
// adding bots to a list
 public List<? extends Player> listBots() {
     List<? extends Player> bot = new ArrayList<>();
     for (Player p : bots) {
         if (p.isRegistered() && p.isBot()) {
             bot.add(p); //compile error
         }
     }

     return bot;
 }

private List players=new ArrayList();//跟踪游戏中的玩家(可能是机器人?)
公共播放器注册器(c频道){//netty频道
玩家=新玩家(上下文,c);
如果(!player.isBot())//机器人程序是免税的
{
//做事
返回球员;
}
players.add(player);//将player添加到列表中
}
公共播放器createBot(
字符串名,
int ID,
int[]起始位置,
浮起爆损
) {
Player p=registerPlayer(null);//此处的强制转换错误
p、 登记册(
名称
身份证件
起始位置,
开始破坏,
);
返回p;
}
//将机器人程序添加到列表中

public List可以将对象强制转换为它自己的类或它扩展的类(层次结构中的任何类都可以转换为对象)以及它实现的任何接口。 Player是您的基类,它由您的NPC_TypeX类扩展。 因此,NPC_TypeX对象可以投射给玩家,但不能投射给周围的其他玩家

这项工作:

Player p = new NPC_Type1();
这并不是:

NPC_Type1 p = new Player(); // Syntax error

在RegisterLayer方法中,实例化的是播放器对象,而不是NPC_TypeX对象

由于您可能希望能够注册任何播放机类型,因此,如果更改方法,您可以将播放机对象(或扩展类的对象)传递到方法中:

 public Player registerPlayer(Channel c, Player player) { //netty channel
        if ((!player.isBot())) // bots are exempt
        {
            //do stuff
            return player;
        }
        players.add(player); // add player to list
 }
使用此方法:

NPC_Type1 npc = new NPC_Type1();
registerPlayer(null, npc);

您仅在此处创建一个
Player
实例:
Player=newplayer(上下文,c)。这不是
NPC\u Type1
的一个实例,所以你不能强制转换为
NPC\u Type1
@JonSkeet好吧,我明白了,但我如何让它对所有实例都起作用?玩家、NPC_类型1、NPC_类型2等。。既然其余的都延长了Player@JonSkeet我是否可以通过某种方式将其作为一个参数来告诉我们要创建什么类型的对象?是的,但我们对情况了解得不够,不知道该建议什么。@JonSkeet,我的意思是,你还需要什么其他信息?我在尝试将玩家添加到列表中时,似乎遇到了一个错误
players
你遇到了什么错误?不管怎样,我找到了答案;谢谢
NPC_Type1 npc = new NPC_Type1();
registerPlayer(null, npc);