Is there a way to make the following implementation in a type safe manner?
public void myMethod( Map> map )
{
map.put("foo", Collections.singletonList("bar");
}
The above implementation doesn't work. It requires a Map> to compile the method map.put() correctly. But myMethod won't accept any subtype of List this way. So, I have to use Map> instead. How can I solve this problem in a type safe manner?
解决方案
public void myMethod( Map> map ) {
map.put("foo", Collections.singletonList("bar") );
}
You can't put a List (the return type of Collections.singletonList() into a Map of ? extends List since the actual type could be any implementation of List. For example, it is not safe to put a generic List into a Map since the List might not be a LinkedList. However, we can easily put a LinkedList into a Map of .
I think you were over thinking your generics. You do not have to use ? extends for a non-generic class. For example, List will hold any Object, the ? extends is not needed to add an object. A List> will only take List objects and not List objects [Generic classes don't inherit based on their parameters]. This is where ? extends comes into play. To add both List and List to a List, the type must be List>.