【问题标题】:Getting 'Type mismatch: cannot convert from ArrayList<HashMap<String,String>> to List<Map<String,String>>' while instantiating a list of maps [duplicate]在实例化地图列表时,获取“类型不匹配:无法从 ArrayList<HashMap<String,String>> 转换为 List<Map<String,String>>”[重复]
【发布时间】:2019-06-29 05:16:36
【问题描述】:
List<Map<String, String>> recordMapList = new ArrayList<HashMap<String,String>>();

上面的行给出了错误: 类型不匹配:无法从 ArrayList> 转换为 List>

但是如果在左侧使用 HashMap 而不是 Map,问题就会消失。 有人可以告诉我为什么会这样。 我需要让左侧包含 Map,因为我可能使用相同的变量在右侧分配 LinkedHashMap,例如,

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

请帮忙。

【问题讨论】:

    标签: java generics data-structures hashmap linkedhashmap


    【解决方案1】:

    我建议您避免使用给定的泛型类型实例化列表,即:

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

    这是从 Java 7 开始的泛型赋值约定(从这个版本开始,赋值集合的泛型类型是通过声明的类型推断出来的)。为什么?由于在声明泛型列表变量时已经明确声明了列表值的声明类型。这些值是地图接口的实例,将在代码实现中提供。

    访问列表值时,重要的是使用的接口 (Map),而不是其实现 (HashMap)。这样,如果Map的实现被替换,就不需要改变recordMapList的赋值。

    请参阅以下示例(显示列表如何不受Map 的实现的约束):

    List<Map<String,String>> recordMapList = new ArrayList<>(); // Declaration + Assignment
    recordMapList.add(new HashMap<>()); // Add a first implementation of Map
    recordMapList.add(new TreeMap<>()); // Add a second implementation of Map
    

    参考:

    奖金:

    【讨论】:

      【解决方案2】:

      虽然ArrayListList 的子类,MapHashMap 的子类,但List&lt;Map&gt; 不是List&lt;HashMap&gt; 的子类。同样,您不能将List&lt;HashMap&gt; 转换为List&lt;Map&gt;。如果可以的话,这意味着我们可以在List&lt;Map&gt; 中添加一个TreeMap,然后将其转换为List&lt;HashMap&gt;,从而违反List&lt;HashMap&gt; 的原始合同。

      如果recordMapList-instance 立即创建,我个人只会使用菱形运算符(Java 7+):

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

      如果它是在其他地方创建的,则只有 List 可以是 ArrayList,但其余部分相同。 (注意:您当然也可以在这里使用菱形运算符,但如果创建实例和实际字段是分开的,我个人更喜欢使用类型,因此可以立即清楚列表中的类型,而无需跳转到代码中的实际字段。)

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

      在这两种情况下,您都可以将 HashMap&lt;String, String&gt; 实例添加到 recordMapList

      【讨论】:

        【解决方案3】:

        原因是List&lt;HashMap&gt;不是List&lt;Map&gt;的子类

        解决方案,您不需要将其声明为:

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

        您可以将其声明为:

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

        然后将HashMap 放入recordMapList

        【讨论】:

          猜你喜欢
          • 2019-11-24
          • 2015-12-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-17
          • 1970-01-01
          • 2020-04-01
          相关资源
          最近更新 更多