自动将字符串转换为动态确定的类型?

时间:2014-02-26 04:13:07

标签: java reflection casting

我正在对xml文件进行一些手动反序列化。我需要将xml文件中的所有值(即字符串)转换为正确的类型。

通过反射将xml标记的名称与对象中的Field相匹配,我得到了正确的类型。

现在,我使用的代码有点难看:

Field matchedField = getMatchingField(getNodeName(node));
Class<?> type = matchedField.getType();

if (Integer.class.isAssignableFrom(type))
{
    return Integer.parseInt(parseNode(node));
}
else if (Double.class.isAssignableFrom(type))
{
    return Double.parseDouble(parseNode(node));
}
else if // ... etc for all the types I am using

有没有办法自动化这个过程?类似的东西:

return ConvertToType(type, parseNode(node));

似乎C#有这样的东西,Java有类似的功能吗?

这不是必须为自定义类型扩展。我可以手动转换自定义类型。

1 个答案:

答案 0 :(得分:1)

我不知道是否有内置功能,但您可以通过使用接口和将类型映射到转换器的地图来避免if链。

以下代码设置地图:

// This interface defines the conversion method
interface Converter {
    Object fromString(String s);
}
// This map has one converter per supported class
static final Map<Class,Converter> mapper = new HashMap<Class,Converter>();
static {
    mapper.put(Integer.class, new Converter() {
        public Object fromString(String s) {
            return Integer.parseInt(s);
        }
    });
    mapper.put(Double.class, new Converter() {
        public Object fromString(String s) {
            return Double.parseDouble(s);
        }
    });
}

设置地图后,您可以执行以下转换:

int x = (int)mapper.get(Integer.class).fromString("123");
double y = (double)mapper.get(Double.class).fromString("1.23");

Here is a demo on ideone.