2008-11-18 21 views
5

¿Cómo hacer esto en Java - pasar una colección de subtipo a un método que requiere una colección de tipo base?genéricos de Java: pasar una colección de subtipo a un método que requiere una colección de tipo base

El siguiente ejemplo da:

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

puedo poner en práctica mediante la creación de una jerarquía de clases para las colecciones de escritos - pero ¿es posible de otro modo?

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: Resulta que a partir de las respuestas que esto requiere "comodín limitada" por lo que añadir este texto a las posibilidades de búsqueda

Respuesta

17

Cambio foo a:

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

que restringirá lo que puede hacer dentro de foo, pero eso es razonable. Sabes que cualquier valor que obtengas del mapa será una lista, pero no sabes qué tipo de valor es válido para ponerlo en el mapa.

+0

gracias! esa es la solución exactamente :-) – horace

2

como Jon s dice:

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

será corregir los errores. aún así tendrás advertencias. eche un vistazo al principio get-put en: http://www.ibm.com/developerworks/java/library/j-jtp07018.html

+0

nice link - ¿Estaba empezando a buscar en Google? extiende :-) – horace

+0

java genéricos no son fáciles, "java generics and collections" (http://oreilly.com/catalog/9780596527754/) es muy útil. –

Cuestiones relacionadas