【问题标题】:Map instance not read as object instance地图实例未读作对象实例
【发布时间】:2018-02-02 12:57:37
【问题描述】:

我有这个代码:

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 是可变的吗?还是这是错误的代码?

【问题讨论】:

  • 因为Map.put() 返回的是,而不是地图本身。
  • 在最后一个样本上尝试了 Map。有效。将尝试调查一些案件一段时间。

标签: java list dictionary generics compiler-errors


【解决方案1】:

HashMap.put() 仅将值作为对象返回,因此 new HashMap&lt;&gt;().put("key", "value"); 不会返回哈希图,而是返回值或 null;

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

你需要做的

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

list.add(item);

【讨论】:

  • list.add(Map.of("key", "value"))(假设您不关心地图的后续可变性)。
  • 'put()' 返回先前与指定键关联的值。它不返回密钥
  • 这是什么Map.of
  • @RobertKock 在我的帖子中修复了它。谢谢
【解决方案2】:

因为put方法

返回:

与键关联的前一个值,如果没有,则返回 null 键的映射。 (空返回也可以表示地图 以前将 null 与键关联。)

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

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

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

【讨论】:

    【解决方案3】:

    Map#put 返回与调用 put 之前的键关联的值(或 null,如果没有这样的值),而不是 Map 本身。

    如果你想让oneliner创建Map,可以考虑Collections#singletonMap

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

    (或者,如果您对不可变地图满意,请直接拨打 new HashMap

    【讨论】:

      【解决方案4】:

      HashMap 中的 put() 方法返回之前插入到映射中的值,而不是对象本身。

      编辑: 你说这行不通:

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

      这是因为您的列表包含“对象映射”类型的元素,而您正在尝试插入“字符串映射”

      【讨论】:

        【解决方案5】:

        您没有放置 java.util.Map&lt;java.lang.Object,java.lang.Object&gt; 的实例,而是 Hasmap.put 的结果,这是 Map#put 的 javadoc 中所述的与键关联的先前值(在您的情况下为 null

        您只需分两步完成:

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

        【讨论】:

          猜你喜欢
          • 2013-12-15
          • 1970-01-01
          • 2012-07-27
          • 2016-06-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-17
          • 2014-03-01
          相关资源
          最近更新 更多