映射实例不作为对象实例读取

时间:2018-02-02 12:57:37

标签: java list dictionary generics compiler-errors

我有这段代码:

List<Map<Object, Object>> list = new ArrayList<>();

list.add(new HashMap<>().put("key", "value"));

然而它告诉我:

  

在List中添加(java.util.Map)不能   应用于(java.lang.Object)

为什么add列表的函数不能将Map实例作为Object实例读取?但如果它是一个简单的列表

List<Object> simpleList = new 
simpleList.add("
simpleList.add(new HashMap<>().put("sample","sample"));

修改

这也不起作用:

Map<String, String> map = new HashMap<>();
map.put("key", "value");
list.add(map);
  

在List中添加(java.util.Map)不能   应用于(java.util.Map)

编辑2

感谢您的回答我现在明白为什么它不起作用。那么实现这一目标的最佳方式是什么?它在循环中迭代,因为我正在向List添加多个HashMaps。

Map<Object, Object> map = new HashMap<>();
something.foreach{ thing ->{
if(map!=null)
map.clear();
map.put("key", thing);
list.add(map);
}
}

map是否可变?或者这是不好的代码?

5 个答案:

答案 0 :(得分:3)

#pragma once只返回作为对象的值,因此执行HashMap.put()不会返回散列映射,而是返回值或null;

  

put 返回:与key关联的上一个值,如果没有key的映射,则返回null。 (null返回也可以指示映射先前将null与key关联。)

你需要做

new HashMap<>().put("key", "value");

答案 1 :(得分:2)

Traceback (most recent call last): File "t_polygon.py", line 14, in <module> p = Polygon(t) File "C:\Program Files (x86)\Python\Lib\site-packages\sympy\geometry\polygon.py", line 126, in __new__ vertices = [Point(a, dim=2, **kwargs) for a in args] File "C:\Program Files (x86)\Python\Lib\site-packages\sympy\geometry\polygon.py", line 126, in <listcomp> vertices = [Point(a, dim=2, **kwargs) for a in args] File "C:\Program Files (x86)\Python\Lib\site-packages\sympy\geometry\point.py", line 157, in __new__ raise ValueError('Nonzero coordinates cannot be removed.') ValueError: Nonzero coordinates cannot be removed. 中的put()方法返回先前在地图中插入的值,而不是对象本身。

编辑: 你说这不起作用:

HashMap

那是因为你的列表包含类型&#34;对象映射&#34;的元素。并且您正在尝试插入&#34;字符串映射&#34;

答案 2 :(得分:2)

您没有放置java.util.Map<java.lang.Object,java.lang.Object>的实例,而是Hasmap.put的结果,这是与Map#put所述的密钥相关的先前值(在您的情况下为null) &#39; javadoc

您只需分两步完成:

Map<Object, Object> map = new HashMap<>();
map.put("key", "value")
list.add(map);

或者一步到位(有趣但不推荐,因为这会毫无意义地创建一个新的匿名类):

list.add(new HashMap<Object, Object>() {
    private static final long serialVersionUID = 1L;
    {
         put("key", "value");
    }
});

答案 3 :(得分:2)

因为put方法

  

返回:

     

与key关联的上一个值,如果没有则返回null   映射为密钥。 (null返回也可以指示地图   以前使用密钥关联null。)

它返回前一个值,因为你的值是Object类型,它返回一个Object。

您无法链接地图创建并将某些内容放入其中并返回地图。 您需要将其拆分为多个步骤:

Map<Object, Object> myMap = new HashMap<>();
myMap.put("key", "value");
list.add(myMap);

答案 4 :(得分:2)

Map#put会在调用put之前返回与该关键字相关联的值(如果没有此值,则返回null),而不是Map本身。

如果您希望oneliner创建Map,您可以考虑Collections#singletonMap

list.add(new HashMap<>(Collections.singletonMap("key", "value")));

(或者,如果您使用不可变地图,则只需将呼叫暂停至new HashMap