将条目添加到地图列表时出错

时间:2012-02-15 11:43:22

标签: java generics generic-list

我对Java中的泛型有点新意。我遇到了以下情况,我不明白为什么代码不起作用。

List<? extends Map<String, String>> listEntries = new ArrayList<HashMap<String,String>>();
Map<String,String> entry = new HashMap<String,String>();
smsListEntry.put("1", "abc");
smsListEntry.put("2", "xyz");
listEntries.add(entry);

它给我一个编译时错误,如:

  

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

4 个答案:

答案 0 :(得分:3)

想象一下,如果你改变了

Map<String,String> entry = new HashMap<String,String>();

Map<String,String> entry = new TreeMap<String,String>();

现在,您已向TreeMap ArrayList添加了HashMap

抛弃通配符,并使用您真正想要的通用参数。

List<Map<String, String>> listEntries = new ArrayList<Map<String,String>>();

更新:为了使其更加明确,图片会使用原始泛型引用ArrayList

List<HashMap<String,String>> orig = new ArrayList<HashMap<String,String>>();
List<? extends Map<String, String>> listEntries = orig;
listEntries.add(new TreeMap<>()); // Shouldn't work!
HashMap<String,String> treeMap = orig.get(0); // Oops! 

答案 1 :(得分:2)

试试这个。

List<Map<String, String>> listEntries = new ArrayList<Map<String,String>>();
            Map<String,String> entry = new HashMap<String,String>();
            entry.put("1", "abc");
            entry.put("2", "xyz");
            listEntries.add(entry);
            System.out.println(listEntries);

答案 2 :(得分:0)

基本上,List<? extends Map<...>表示“我的列表限制为包含一些扩展Map的类型,但我不知道确切的类型”。现在假设确切的类型实际上是TreeMap:有意义的是,您不能将HashMap放入此列表中。

一般来说,如果您有一些Type<E>并且声明Type<? extends X> var,则永远不会允许您在var上调用任何以E为参数的方法,因为编译器无法确定?允许的内容(可能是X,但可能只是X的某个子类型)。这就是为什么你不能在这里打电话给add

答案 3 :(得分:-1)

List<? extends Map<String, String>> listEntries = new ArrayList<HashMap<String,String>>();

你应该把它写成

List<Map<String, String>> listEntries = new ArrayList<Map<String,String>>();

您应该使用条目Interface。

来定义列表类型

然后使用它:

Map<String,String> entry = new HashMap<String,String>();
entry.put("1", "abc");
entry.put("2", "xyz");
listEntries.add(entry);
listEntries.add(new LinkedHashMap<String, String>()); // if you want you can use different implementations of Map