2010-08-13 4 views
2

Je reconnais que je n'ai pas beaucoup d'expérience dans l'utilisation de Java Generics.Problème avec la liste générique et ajout de wrapper

À l'heure actuelle, je modernise un ancien code avec Generics pour réduire/simplifier le code existant écrit par un collègue qui a depuis quitté l'entreprise. Fondamentalement, le système sur lequel je travaille a 6 types de demandes: 1 Général, et 5 spécifiques qui héritent de Général. Chaque type de requête a des types de tâches associés.

est ici le code où je vais avoir la peine:

public class GeneralRequest implements Serializable { 
    protected List<? extends GeneralTask> taskList; 

    public <E extends GeneralTask> boolean addTask(E newTask) { 
     boolean returnvalue = false; 

     if(!this.taskList.contains(newTask)){ 
      returnvalue = taskList.add(newTask); 
     } 
     return returnvalue; 
    } 
} 

public class AnnexationRequest extends GeneralRequest implements Serializable { 
    public AnnexationRequest(List<AnnexationTask> tal) { 
     this.taskList = tal; 
    } 
} 

Le problème est dans la ligne ajouter à GeneralRequest. Dans sa forme actuelle, les bombes de ligne taskList.add avec

The method add(capture#6-of ? extends GeneralTask) in the type List<capture#6-of ? extends GeneralTask> is not applicable for the arguments (E) 

Maintenant, si je change la déclaration taskList à

protected List<? super GeneralTask> taskList; 

Il résout ce problème, mais les classes d'enfants me donnent une autre erreur, comme en AnnexationRequest:

Type mismatch: cannot convert from List<AnnexationTask> to List<? super GeneralTask> 

Comment puis-je résoudre ce problème afin que AddTask fonctionne correctement et je peux toujours définir la liste des tâches du constructeur?

Répondre

4
public class GeneralRequest<E extends GeneralTask> implements Serializable { 

    private final List<E> taskList; 

    protected GeneralRequest(List<E> taskList) { 
    this.taskList = taskList; 
    } 

    public boolean addTask(E newTask) { 
    if(this.taskList.contains(newTask)) 
     return false; 
    taskList.add(newTask); 
    return true; 
    } 

} 

public class AnnexationRequest extends GeneralRequest<AnnexationTask> { 
    public AnnexationRequest(List<AnnexationTask> tal) { 
    super(tal); 
    } 
} 
+0

Ah, je ne pensais pas mettre le type de tâche en tant que classe générique. Oups. – Powerlord

1

Vous ne pouvez pas mettre un élément (autre que null) dans un Collection<?>.

Cependant, vous pouvez utiliser

protected List<GeneralTask> taskList; 
+0

Oui, mais j'utilise 'Liste protégée 'qui autorise' GeneralTask' et définit quelle sous-classe dans les différents constructeurs de classe Request. – Powerlord

Questions connexes