我正在寻找一种简单,简洁的方法将给定的Number对象转换为给定数值类型的对象。
我需要类似的东西:
private static Number convert(Number num, Class<? extends Number> targetType)
有没有办法在不检查所有类型组合的情况下执行此操作?
答案 0 :(得分:4)
您可以使用以下内容:
String simpleName = targetType.getSimpleName().toLowerCase();
if (simpleName.equals("integer")) {
simpleName = "int";
}
Method m = number.getClass().getMethod(simpleName + "Value");
return (Number) m.invoke(number);
这依赖于Number
包含longValue()
,floatValue()
等方法的事实。
至于BigInteger
或AtomicInteger
- 你可以反思地使用它们的构造函数,它接受一个参数 - 原始类型。
答案 1 :(得分:4)
我认为最明智的方法是使用蛮力:
private static Number convert(Number num, Class<? extends Number> targetType) {
Number result = null;
if (Byte.class.equals(targetType)) {
result = Byte.valueOf(num.byteValue());
} else if (Short.class.equals(targetType)) {
result = Short.valueOf(num.shortValue());
} else if (...) {
...
} else {
throw new IllegalArgumentException("targetType is not a Number");
}
return result;
}
你可能会使用反射,但我发现更多的是hackish。
答案 2 :(得分:1)
也许通过BigDecimal
进行转换会有效吗?