【问题标题】:Change Map of Map to generic type将 Map 的 Map 更改为泛型
【发布时间】:2019-03-19 06:04:39
【问题描述】:

我有一个方法,它接受一个 Map,它的 Key 是 String,值是 T 类型的对象,它是一个可序列化的对象。

public <T extends Serializable> void set(String key, Map<String, T> fields) {
  ......
  .......
}

当我尝试传递 map 的 map 时,它会因错误的参数类型而出错。我希望此方法采用通用对象,并且不想将其更改为set(String key, Map&lt;String, Map&lt;String, String&gt;&gt; fields)

Map<String, String> fieldmapL1 = new HashMap<>();
fieldmapL1.put("ABC", "XYZ");
Map<String, Map<String, String>> fieldmapL2 = new HashMap<>();
fieldmapL2.put("Key", fieldmapL1);

instance.set("key", fieldmapL2);

【问题讨论】:

    标签: java dictionary oop generics jvm


    【解决方案1】:

    您需要指明您正在使用的类型:

    instance.<Map<String, String>>set("key", fieldmapL2);
    

    然后键入T 被解析为String。此外,这仅在 instance 正确实例化时才有效(您可以在实例化时将 T 设置为 String,然后您不需要上述行,或者您可以省略显式类型并使用我的解决方案)。

    【讨论】:

    • 我希望将类型 T 解析为 Map&lt;String, String&gt; 而不是 String。实例已正确实例化。
    • 而不是 它应该是 Map 否则 T 将是字符串类型
    • 是的,对不起,忘记了;)
    • 不。我已经尝试过了。它给出了同样的错误instance.&lt;HashMap&lt;String, String&gt;&gt;set("key", fieldmapL2);
    • @Lino Map 不是可序列化的对象。因此使用HashMap HashMap
    【解决方案2】:

    您的问题是您键入的内容不符合您的要求。正如@Pankaj 在本主题的其他 cmets 中所解释的那样,Map 是不可序列化的,因此您对 fieldmap2 的定义不符合 T 的标准。更新映射的实例以正确使用实现可序列化的 HashMap 就可以了(在 intelliJ 中不再有警告)

    public static class Test{
            public <T extends Serializable> void set(String key, Map<String, T> fields) {
    
            }
        }
    
    
        public static void main(String[] args) {
            HashMap<String, String> fieldMapL1 = new HashMap<>();
            fieldMapL1.put("ABC", "XYZ");
            Map<String, HashMap<String, String>> fieldmap2 = new HashMap<>();
            fieldmap2.put("key", fieldMapL1);
    
            Test test = new Test();
            test.set("key", fieldmap2);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多