Java: ClassCastException;将 Player class 转换为扩展 Player 的 class

Java: ClassCastException; casting Player class to class that extend Player

我无法理解如何解决在我的在线多人游戏中创建扩展玩家 class 的机器人的问题。

如果我尝试制作扩展播放器的 classes(NPC_Type1、NPC_Type2 等),我希望能够在扩展 class 不是玩家,因为每个 class 都会做一些不同的事情。

只要将其转换为正确的类型就会出现错误:

演员表示例:

NPC_Type1 p = (NPC_Type1)registerPlayer(null)

java.lang.ClassCastException: class com.testgame.server.model.player.Player cannot be cast to class com.testgame.server.model.player.NPC_Type1 (com.testgame.server.model.player.Player and com.testgame.server.model.player.NPC_Type1 are in unnamed module of loader '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;
 }

有人可以用一个小例子解释我做错了什么以及如何解决吗?

一个对象可以转换为它自己的 class 或它扩展的 class(层次结构中向下到 Object 的任何 class)以及它实现的任何接口。 Player 是您的基础 class,由您的 NPC_TypeX classes 扩展。 因此,一个 NPC_TypeX 对象可以被投射到 Player 而不是其他人。

这个有效:

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_TypeX 个对象。

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

 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);