2017-03-25 2 views
-1

J'essaie d'utiliser Réflexion en java à
instancier un joueur avec un motif de commande aime ci-dessous:Quelle est la meilleure façon d'instancier une classe en utilisant Reflection avec le polymorphisme?

Il n'y a qu'un seul 'exécuter' méthode dans un Classe de commande,
Et le InitiatePlayerCommand comme son nom, il instanciera un
sous-classe du joueur selon le playerClass passé dans le constructeur.

J'ai deux types de sous-classe de la classe du joueur: HumanPlayer et AiPlayer pour le polymorphisme.

j'attendre instanciera un d'entre eux sous-classe et ajouter dans le JOUEURS

, mais je ne sais pas quelle est la meilleure façon d'atteindre ce avec la réflexion. Il se produit toujours une erreur de typage.

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

} 

}

Est-il possible d'atteindre cet sans utiliser la classe <? >

+1

fonctionne bien pour moi. –

Répondre

1

Vous devriez envisager d'utiliser un Supplier<T>, qui est une fonction sans argument qui renvoie un objet.

Dans ce cas, votre Supplier pourrait être défini comme ceci:

Supplier<Player> playerSupplier =() -> new HumanPlayer(); 

Vous pouvez alors l'utiliser comme ceci:

public void execute() { 
    Player player = playerSupplier.get(); 
    player.setName(name); 
    player.setWarMode(warMode); 
    playerList.add(player); 
}