将值放入hashmap,在java中使用通配符不能赋值

时间:2013-12-13 02:21:25

标签: java generics inheritance map wildcard

我正在学习java中的泛型。 我创建了一个Map并使用'new HashMap>()'进行了初始化。 之后,我创建了一个ArrayList来放入该变量。 但是,此代码无法编译。

错误信息是:

“类型Map>中的方法put(String,capture#1-of?extends List)不适用于参数(String,List)”

在Map.put()方法上。

我的代码如下。

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);
    }
};

我无法理解为什么编译器看起来是类型,即使我分配了继承的类'List'。

抱歉我的英语不好,欢迎编辑。 谢谢你的回答:D

1 个答案:

答案 0 :(得分:3)

您不能将null以外的任何内容放入带有? extends ...参数的泛型类型中。这是基本的泛型 - 因为类型参数是未知的,你不能把任何东西放进去,因为你试图放置的东西不能保证是那种未知类型的子类型。

回想一下PECS(制作人extends,消费者super)规则。 ? extends只能用于生产者。放入内容是消费者。