2008-11-18 5 views
5

Comment faire cela en Java - passer une collection de sous-type à une méthode nécessitant une collection de type de base?Génériques Java - passage d'une collection de sous-type à une méthode nécessitant une collection de type de base

L'exemple ci-dessous donne:

The method foo(Map<String,List>) is not applicable for the arguments (Map<String,MyList>) 

Je peux mettre en œuvre en créant une hiérarchie de classes pour les collections typées - mais est-il possible autrement?

public void testStackOverflow() { 

    class MyList extends AbstractList { 
     public Object get(int index) { 
      return null; 
     } 
     public int size() { 
      return 0; 
     }   
    }; 

    Map <String, List> baseColl = null; 
    Map <String, MyList> subColl = null; 

    foo (subColl);    
} 

private void foo (Map <String, List> in) {  
} 

EDIT: Il s'avère que des réponses que cela nécessite « wildcard limitée » afin d'ajouter ce texte pour facilité de recherche

Répondre

17

Changement foo à:

private void foo(Map <String, ? extends List> in) { 
} 

qui limiteront ce que vous pouvez faire dans foo, mais c'est raisonnable. Vous savez que toute valeur que vous extrayez de la carte sera une liste, mais vous ne savez pas quel type de valeur est valide pour la carte.

+0

merci! c'est exactement la solution :-) – horace

2

comme jon s dit:

private void foo (Map <String, ? extends List> in { ... } 

corrigera les erreurs. vous aurez toujours des avertissements. jetez un oeil le principe get-put à: http://www.ibm.com/developerworks/java/library/j-jtp07018.html

+0

nice link - Je commençais juste à google pour? étend :-) – horace

+0

java génériques ne sont pas faciles, "génériques java et collections" (http://oreilly.com/catalog/9780596527754/) est très utile. –