我很难理解如何解决这个问题,创建一个机器人,扩展我的在线多人游戏的球员类。
如果我尝试创建扩展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;
}
有人能用一个小例子来解释我做错了什么以及如何改正吗?
1条答案
按热度按时间monwx1rj1#
一个对象可以被转换为它自己的类或它扩展的类(层次结构中的任何类都可以转换为对象)以及它实现的任何接口。player是这里的基类,由npc\u typex类扩展。因此,一个npc\u typex对象可以投射给玩家,但不能投射给周围的其他玩家。
这样做有效:
这并不意味着:
也
在registerplayer方法中,您是示例化player对象,而不是npc\u typex对象。
由于您可能希望能够注册任何播放机类型,因此如果更改方法,您可以将播放机对象(或扩展类的对象)传递到方法中:
使用方法: