2011-03-31 6 views
1

Mon code est comme ci-dessous:Generics problème lié

private <A extends AbstractDocument> List<A> reorderDocuments(List<A> docs) 
    { 
     List<A> newdoclist = new ArrayList<A>(); 
     for (A o : docs) { 
      if(//some condition) { 
       //TODO::Generic type 
       List<A> tempDocs = new ArrayList<A>(); 
       tempDocs.add(o); 
       tempDocs.addAll(o.getAlikeDocuments()); 
       //sort method called 
      } 
      return newdoclist; 
    } 

ont changé la balise de début pour le type avec la fonction o.getAlikeDocuments() Retourne la liste de type de document abstrait, mais cette méthode me donne toujours l'erreur sur la ligne tempDocs.addAll(o.getAlikeDocuments()); disant La méthode addAll(Collection<? extends A>) dans la liste Type n'est pas applicable pour les arguments (List<AbstractDocument>). Appréciez l'aide à l'avance.

Merci

Vaibhav

+1

Format vous code à l'aide de { } bouton et pas directement avec HTML –

+1

Aussi, vous devez accepter une réponse! – MarcoS

+0

J'ai accepté votre réponse en cliquant sur le bon signe espoir qui suffit :) – vaibhav

Répondre

3

Le problème que vous avez est que A est une sous-classe de AbstractDocument et vous ne pouvez pas ajouter AbstractDocument sauf sous-classes de A

Pour le compiler, si vous sachez que ce n'est pas un problème est d'utiliser l'effacement de type.

tempDocs.addAll((List) o.getAlikeDocuments()); 
+0

Seulement s'il est sûr que o.getAlikeDocuments() retournera définitivement une liste d'objets de type A (ou sous-type). Il semble que le type de retour de cette méthode soit List ce qui signifie que, s'il utilise votre solution, il pourrait finir par ajouter des objets AbstractDocument à une liste . – CodeClimber

+1

juste remarqué que vous avez dit "si vous savez que ce n'est pas un problème" – CodeClimber

+0

Oui, il est logique pour moi car le type de retour de cette méthode serait toujours AbstractDocument, Merci pour l'aide! j'apprécie! – vaibhav