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);
我无法理解如何解决在我的在线多人游戏中创建扩展玩家 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);