[英]Map instance not read as object instance
我有以下代码:
List<Map<Object, Object>> list = new ArrayList<>();
list.add(new HashMap<>().put("key", "value"));
但是它告诉我:
无法将列表中的(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);
列表中的add(java.util.Map)无法应用于(java.util.Map)
编辑2 :
感谢您的回答,我现在知道为什么它不起作用。 那么,实现此目标的最佳方法是什么? 因为要向列表中添加多个HashMap,所以它在循环中进行迭代。
Map<Object, Object> map = new HashMap<>();
something.foreach{ thing ->{
if(map!=null)
map.clear();
map.put("key", thing);
list.add(map);
}
}
map
可变吗? 还是这是错误的代码?
HashMap.put()
仅将值作为对象返回,因此执行new HashMap<>().put("key", "value");
不返回哈希图,而是返回值或null;
put返回:与键关联的先前值;如果没有键的映射关系,则返回null。 (返回null可能还表明该映射先前将null与key关联。)
你需要做
Map<Object, Object> item = new HashMap<>();
item.put("key", "value");
list.add(item);
HashMap
的put()
方法返回先前插入到地图中的值,而不是对象本身。
编辑:您说这不起作用:
Map<String, String> map = new HashMap<>();
map.put("key", "value");
list.add(map);
这是因为您的列表包含类型为“对象映射”的元素,并且您正在尝试插入“字符串映射”
您没有放置java.util.Map<java.lang.Object,java.lang.Object>
的实例,而是放置了Hasmap.put的结果,该结果是与键关联的先前值(在您的情况下为null
),如上所述由Map#put的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");
}
});
因为put方法
返回值:
与key关联的先前值;如果没有key映射,则为null。 (返回null可能还表明该映射先前将null与key关联。)
它返回先前的值,并且由于您的值属于Object类型,因此它返回一个Object。
您无法将地图创建链接在一起并将某些内容放在一起并返回地图。 您需要将其分为多个步骤:
Map<Object, Object> myMap = new HashMap<>();
myMap.put("key", "value");
list.add(myMap);
Map#put
返回与调用put
之前的键关联的值(如果没有这样的值,则返回null
),而不是Map
本身。
如果您想要一个内联创建Map
,则可以考虑Collections#singletonMap
:
list.add(new HashMap<>(Collections.singletonMap("key", "value")));
(或者,如果您对不可变的地图没问题的话,只需将呼叫放到new HashMap
上)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.