tags:

views:

845

answers:

2

How to do this in Java - passing a collection of subtype to a method requiring a collection of base type?

The example below gives:

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

I can implement by creating a class hierarchy for the typed collections - but is it possible otherwise?

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: Turns out from the answers that this requires "bounded wildcard" so adding this text for searchability

+14  A: 

Change foo to:

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

That will restrict what you can do within foo, but that's reasonable. You know that any value you fetch from the map will be a list, but you don't know what kind of value is valid to put into the map.

Jon Skeet
thanks! that's the solution exactly :-)
horace
+1  A: 

as jon s says:

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

will fix the errors. you will still have warnings though. take a look the get-put principle at: http://www.ibm.com/developerworks/java/library/j-jtp07018.html

Ray Tayek
nice link - I was just starting to google for ? extends :-)
horace
java generics are not easy, "java generics and collections" (http://oreilly.com/catalog/9780596527754/) is very helpful.
Ray Tayek