java:classcastexception;将玩家类转换为扩展玩家的类

inb24sb2  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(372)

我很难理解如何解决这个问题,创建一个机器人,扩展我的在线多人游戏的球员类。
如果我尝试创建扩展player的类(npc\u type1,npc\u type2,等等),我希望能够注册到扩展类而不是player,因为每个类都会做一些不同的事情。
只是将其转换为正确的类型会给我一个错误:
演员示例:

NPC_Type1 p = (NPC_Type1)registerPlayer(null)

java.lang.classcastexception:类com.testgame.server.model.player.player不能强制转换为类com.testgame.server.model.player.npc\u type1(com.testgame.server.model.player.player和com.testgame.server.model.player.npc\u type1在加载器“app”的未命名模块中)
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;
 }

有人能用一个小例子来解释我做错了什么以及如何改正吗?

monwx1rj

monwx1rj1#

一个对象可以被转换为它自己的类或它扩展的类(层次结构中的任何类都可以转换为对象)以及它实现的任何接口。player是这里的基类,由npc\u typex类扩展。因此,一个npc\u typex对象可以投射给玩家,但不能投射给周围的其他玩家。
这样做有效:

Player p = new NPC_Type1();

这并不意味着:

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

Player p = new NPC_Type1();
NPC_Type1 n = (NPC_Type1) p; // This is fine since p is of type NPC_Type1

Player p2 = new Player();
NPC_Type1 n2 = (NPC_Type1) p2; // ClassCastException

在registerplayer方法中,您是示例化player对象,而不是npc\u 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);

相关问题