Java 如何将接口反序列化到特定实现?

Java 如何将接口反序列化到特定实现?,java,json,gson,deserialization,Java,Json,Gson,Deserialization,如果我尝试反序列化下面的包装器类,该类用于保存类哈希映射的实例,则反序列化器将替换com.google.gson.internal.LinkedTreeMap的类,这是不需要的 如何确保字段的实际类型是我想要的,即HashMap 这里有一个MCVE来说明我的问题: public class HashMapTry { public static class Wrapper { public String title = "My Title"; public

如果我尝试反序列化下面的
包装器
类,该类用于保存类
哈希映射
的实例,则反序列化器将替换
com.google.gson.internal.LinkedTreeMap
的类,这是不需要的

如何确保字段的实际类型是我想要的,即
HashMap

这里有一个MCVE来说明我的问题:

public class HashMapTry {
    public static class Wrapper {
        public String title = "My Title";
        public Map<String, String> map = new HashMap<String,String>();
    }

    public static void main(String[] args) {
        Wrapper wrapper = new Wrapper();
        Wrapper wrapper2;

        wrapper.map.put("vertical", "1, 0");
        wrapper.map.put("horizontal", "0, 1");

        GsonBuilder gb = new GsonBuilder()
                .enableComplexMapKeySerialization()
                .serializeNulls()
                .setPrettyPrinting()
                .setVersion(1.0)
                .setDateFormat("yyyy.MM.dd HH:mm:ss");

        Gson g = gb.create();

        String json = g.toJson(wrapper);
        System.out.println(json);

        wrapper2 = g.fromJson(json, Wrapper.class);
        System.out.println(wrapper2.map.getClass());
    }
}

只需在包装器类中将其声明为
HashMap
。默认情况下,Gson不喜欢反序列化到接口,因为它必须确定反序列化到哪个类。如果它是某个随机接口(例如,
interface MyInterface
),它实际上会导致问题,因为该接口没有默认行为,您必须指定它,您可以通过注册一个

然而,这对于这种情况来说太复杂了。只需在包装器类中将其称为
HashMap
。如果实现不重要,则仅编程到接口;如果实现重要,则编程到实现,这一点在这里很明显

public static class Wrapper {
  public String title = "My Title";

  public HashMap<String, String> map = new HashMap<String, String>();
}