将Map更改为通用类型

时间:2019-03-19 06:04:39

标签: java generics hashmap

我有一个方法,该方法采用一个Map,该Map的Key为String,而value为类型T的对象,T是可序列化的对象。

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

当我尝试传递map地图时,它给出了错误的参数类型错误。我希望此方法采用通用对象,并且不想将其更改为set(String key, Map<String, Map<String, String>> 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);

enter image description here

2 个答案:

答案 0 :(得分:3)

您需要指出类型,您正在使用:

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

然后将类型T解析为String。此外,这仅在正确instance实例化的情况下才有效(您可以在实例化时将T设置为String,则不需要上面的行,也可以省略显式类型并使用解决方案)。

答案 1 :(得分:2)

您遇到的问题是您键入的内容不符合您的要求。正如@Pankaj在该主题的其他评论中所解释的那样,Map无法序列化,因此您对fieldmap2的定义不符合T的条件。更新映射的实例以正确使用实现了serializable的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);
    }