Java 使用多态性反射实例化类的最佳方法是什么?

Java 使用多态性反射实例化类的最佳方法是什么?,java,class,reflection,polymorphism,command-pattern,Java,Class,Reflection,Polymorphism,Command Pattern,我试图用java中的反射来 用命令模式实例化玩家,如下所示: 命令类中只有一个“execute”方法, 而InitiatePlayerCommand作为其名称,它将实例化一个 根据构造函数中传递的playerClass的Player子类 我有两种玩家类的子类:HumanPlayer和AiPlayer 对于多态性 我希望它将实例化其中一个子类并添加到playerList中 但我不知道通过反思达到这一目的的最佳方式是什么。它总是发生类型转换错误 public class InitiatePlayer

我试图用java中的反射
命令模式实例化玩家,如下所示:

命令类中只有一个“execute”方法,
InitiatePlayerCommand作为其名称,它将实例化一个
根据构造函数中传递的playerClassPlayer子类

我有两种玩家类的子类:HumanPlayerAiPlayer 对于多态性

我希望它将实例化其中一个子类并添加到playerList中

但我不知道通过反思达到这一目的的最佳方式是什么。它总是发生类型转换错误

public class InitiatePlayerCommand implements Command{
private List<Player> playerList;
private String name;
private WarMode warMode;
private Class<?> playerClass;
public <T extends Player> InitiatePlayerCommand(String name, WarMode mode ,List<Player> list
        ,Class<T> playerClass){
    this.name = name;
    this.warMode = mode;
    this.playerList = list;
    this.playerClass = playerClass;
}

@Override
public void execute() throws InstantiationException, IllegalAccessException, IllegalArgumentException, NoSuchFieldException, SecurityException {
    Player player = (Player) playerClass.newInstance();
    player.setName(name);
    player.setWarMode(warMode);
    playerList.add(player);
}

public static void main(String[] argv){
    List<Player> playerList = new ArrayList<Player>();
    new InitiatePlayerCommand("Johnny",WarMode.MILITARY,playerList,HumanPlayer.class)
            .execute();  // this line get an error HumanPlayer.class isn't compatible to Class<T extends Player> playerClass
    System.out.println(playerList);

}
公共类InitiatePlayerCommand实现命令{
私人名单玩家名单;
私有字符串名称;
私人战争模式;
私家班;
公共InitiatePlayerCommand(字符串名称、WarMode模式、列表
,playerClass){
this.name=名称;
this.warMode=mode;
this.playerList=列表;
this.playerClass=playerClass;
}
@凌驾
public void execute()抛出实例化异常、IllegalAccessException、IllegalArgumentException、NoSuchFieldException、SecurityException{
Player=(Player)playerClass.newInstance();
player.setName(name);
player.setWarMode(warMode);
玩家列表。添加(玩家);
}
公共静态void main(字符串[]argv){
List playerList=new ArrayList();
新的InitiatePlayerCommand(“强尼”,战争模式。军事,玩家列表,人类玩家。职业)
.execute();//此行出错HumanPlayer.class与类playerClass不兼容
System.out.println(playerList);
}
}


有没有办法达到这个“强”?不使用类< /强>

你应该考虑使用<代码>供应商< /C> >,这是一个返回对象的无ARG函数。

在这种情况下,您的
供应商可能定义如下:

Supplier<Player> playerSupplier = () -> new HumanPlayer();
public void execute() {
    Player player = playerSupplier.get();
    player.setName(name);
    player.setWarMode(warMode);
    playerList.add(player);
}

对我来说很好。