可以编写通用的XmlAdapter

我知道,我可以使用Raw类型来编写XMLAdapter,但我可以使用generics类型。 我试过阅读API( 链接 ),但甚至没有注意到这一点的线索。

例如地图:

我想用,比如:

@XmlJavaTypeAdapter(GenericMapAdapter.class)// private final HashMap depWageSum = // new HashMap(); 

要得到

  289.001 499.817 41.824 ...  

类本身可能看起来像以下几行:

 @SuppressWarnings("serial") public class GenericMapAdapter extends XmlAdapter<GenericMapAdapter.MapType, Map> { public static class MapType { @XmlValue protected final List<MapTypeEntry> entry = new ArrayList<MapTypeEntry>(); public static class MapTypeEntry { @XmlAttribute protected K key; @XmlValue protected V value; private MapTypeEntry() {}; public static  MapTypeEntry of(final K k, final V v) { return new MapTypeEntry() {{this.key = k; this.value = v;}}; } } } @Override public Map unmarshal(final GenericMapAdapter.MapType v) throws Exception { return new HashMap() {{ for (GenericMapAdapter.MapType.MapTypeEntry myEntryType : v.entry) this.put(myEntryType.key, myEntryType.value);}}; } @Override public MapType marshal(final Map v) throws Exception { return new GenericMapAdapter.MapType() {{for (K key : v.keySet()) this.entry.add(MapTypeEntry.of(key, v.get(key)));}}; } } 

您将无法按照描述执行此操作。 类不会保留类型参数。 但是,您可以引入一些可以利用GenericMapAdapter中的逻辑的简单子类:

 public class StringDoubleMapAdapter extends GenericMapAdapter { } 

然后在属性上使用适配器子类:

 @XmlJavaTypeAdapter(StringDoubleMapAdapter.class)// private final HashMap depWageSum = // new HashMap(); 

有关XmlAdapter的更多信息,请参阅: