问题
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<String> tmpArr = new ArrayList<String>();
tmpArr.add("A");
tmpArr.add("B");
List<?> value = new ArrayList<String>(tmpArr);
Map<String, ? extends List<String>> testMap = new HashMap<String, List<String>>();
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
回答1:
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.
来源:https://stackoverflow.com/questions/20558007/put-a-value-into-hashmap-which-uses-wildcard-in-java-can-not-assign-value