put a value into hashmap which uses wildcard in java can not assign value

家住魔仙堡 提交于 2019-12-08 09:33:42

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!