我有一个要求,我必须编写一个自定义XStream MapConverter,只转换特定类型的地图。举个例子,我希望我的自定义转换器能够使用Map(String,Date)映射。我需要通过覆盖canConvert方法来实现这一点。截至目前,这是我写的canConvert方法:
@Override
public boolean canConvert(Class clazz) {
return (!clazz.equals(Object.class) && Map.class.isAssignableFrom(clazz));
}
但这适用于所有类型的地图。由于“java.lang.Class”没有公开任何提供有关参数类型信息的方法,因此对于泛型集合,我无法在canConvert方法中实现所需的结果。
我可以想到的一个解决方法是围绕Map(String,Date)创建一个虚拟包装类,并使用它来实现canConvert方法。有人可以建议在canConvert方法中更好地解决这个问题吗?
答案 0 :(得分:0)
由于它们在运行时不存在,因此您无法在此处使用泛型。您可以尝试抓取第一个键和条目值并检查其类型。这显然不适用于空地图,但如果地图为空,您可能无需转换它。
Map<String, Date> m = new HashMap<String, Date>();
m.put("test", new Date());
Object key = m.keySet().iterator().next();
Object value = m.get(key);
System.out.println(key.getClass().isAssignableFrom(String.class));
System.out.println(value.getClass().isAssignableFrom(Date.class));
除此之外,就像你说的那样,你几乎必须制作自己的包装类或滚动一个只接受字符串键和日期值的Map的自定义实现。