使用JSON配置并使用Java Generics转换数据类型

时间:2016-09-15 22:15:03

标签: java generics casting

我正在使用typesafehub配置库的JSON配置。我需要将Double值转换为Float,因为JSON只保留“数字”,而不指定它们是Float还是Double。这适用于其他数据类型,例如ByteShort等。

我想出的解决方案如下:

public <T> T getNumber(String path, Class<T> clazz) {
    Number number = this.config.getNumber(path);
    // Or alternatively, I can also get an Object or Double value
    // Double dub = this.config.getDouble(path);
    // Object obj = this.config.getValue(path).unwrapped();

    if (clazz == Byte.class) {
        return clazz.cast(number.byteValue());
    } else if (clazz == Short.class) {
        return clazz.cast(number.shortValue());
    } else if (clazz == Integer.class) {
        return clazz.cast(number.intValue());
    } else if (clazz == Long.class) {
        return clazz.cast(number.longValue());
    } else if (clazz == Float.class) {
        return clazz.cast(number.floatValue());
    } else if (clazz == Double.class) {
        return clazz.cast(number.doubleValue());
    }

    // Will usually return cast exception if not of type Double
    return clazz.cast(number);
}

如果我尝试将Object转换为Float,或者由于原始类型未在编译时定义而导致转换异常,那么最佳解决方案就是直接转换它(因此,显然我不会让Object/Double Object向那样的Float投射。

我的解决方案有效,但似乎我想要做的事情非常漫长。我所要做的就是从一个配置中获取不同的数据类型,该配置主要将数字存储为双打。唯一的另一种选择是为每个演员阵容设置一个单独的方法:

public float getFloat(String path) {
    return (float) this.config.getDouble(path);
}

我有什么解决方案吗?我宁愿没有一个巨大的嵌套if语句,但似乎泛型在这种情况下不是很有用,尽管总体上有帮助。

0 个答案:

没有答案