I am studying Generics in java.
I made a Map and initialized with 'new HashMap>()'.
After that, I made an ArrayList to put into that variable.
However, this code can not compile.
error message is:
"The method put(String, capture#1-of ? extends List) in the type Map> is not applicable for the arguments (String, List)"
on Map.put() method.
My code is below.
package org.owls.generic.main;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Main {
public static void main(String[] args) {
ArrayList tmpArr = new ArrayList();
tmpArr.add("A");
tmpArr.add("B");
List> value = new ArrayList(tmpArr);
Map> testMap = new HashMap>();
testMap.put("K", value);
}
};
I can not understand why compiler looks type, even I assigned inheritanced Class which is 'List'.
Sorry for my poor English and edit will be welcomed.
Thanks for your answer:D
解决方案
You cannot put anything except null into a generic type with the ? extends ... parameter. This is basic Generics -- since the type parameter is unknown, you cannot put anything into it because whatever you try to put is not guaranteed to be a subtype of that unknown type.
Recall the PECS (Producer extends, Consumer super) rule. ? extends can only be used for producers. Putting something in is a Consumer.