Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中数字对象之间的转换_Java_Numbers - Fatal编程技术网

Java中数字对象之间的转换

Java中数字对象之间的转换,java,numbers,Java,Numbers,我正在寻找一种简单、简洁的方法,将给定的数字对象转换为给定数字类型的对象 由于缩小转换范围而导致精度损失是可以接受的 我宁愿不受约束 我需要像这样的东西: private static Number convert(Number num, Class<? extends Number> targetType) String simpleName = targetType.getSimpleName().toLowerCase(); if (simpleName.equals("

我正在寻找一种简单、简洁的方法,将给定的数字对象转换为给定数字类型的对象

  • 由于缩小转换范围而导致精度损失是可以接受的
  • 我宁愿不受约束
我需要像这样的东西:

private static Number convert(Number num, Class<? extends Number> targetType)
String simpleName = targetType.getSimpleName().toLowerCase();
if (simpleName.equals("integer")) {
   simpleName = "int";
}
Method m = number.getClass().getMethod(simpleName + "Value");
return (Number) m.invoke(number);

private static Number convert(Number num,Class也许通过
BigDecimal
转换会起作用?

您可以使用以下方法:

private static Number convert(Number num, Class<? extends Number> targetType)
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()
等方法


至于
biginger
AtomicInteger
,您可以反射性地使用它们的构造函数,它接受一个参数-原语类型。

我认为最清晰的方法是使用蛮力:

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;
}

private static Number convert(Number num,Class+1)。需要检查类型
AtomicInteger
AtomicLong
BigDecimal
biginger
,是否没有作为targetType传入,因为它们没有xxxValue()方法:<代码>编号<代码> @ Noel M:我不需要处理这些类型。但是,现在我意识到性能是重要的。我可以考虑冗长的解决方案……无论如何,我喜欢这个解决方案的创造性:我怀疑这需要转换为字符串或使用反射,对吗?不管实现如何,我至少会将方法签名重写为
publicstaticn convert(数字、类类型)
。这将完全返回指定的数字类型,这在后处理中可能会有好处。@BalusC:你说得对。谢谢!+1以避免反射。反射将减慢应用程序的速度…我也会这样做。很好。我将使用此解决方案。使用这些类型的静态方法,实际上不需要检查所有的t谢谢,谢谢!