java.lang.Long无法强制转换为java.lang.Double

时间:2015-09-24 09:12:30

标签: java

我有一个方法,它将对象作为输入,如果输入是instanceOF Long,则将值转换为double值。以下是代码:

std::move

但是当我执行上面的代码时,我遇到了异常:

std::swap

请让我知道为什么它给我例外。

但是如果直接尝试将Long对象转换为double,则没有classCast的异常即将到来。

public static void main(String[] args) {
    Long longInstance = new Long(15);
    Object value = longInstance;
    convertDouble(value);
}

static double convertDouble(Object longValue){
    double valueTwo = (double)longValue;
    System.out.println(valueTwo);
    return valueTwo;
}

这令人困惑。

5 个答案:

答案 0 :(得分:6)

在JLS中找到解释,https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.5
表5.1下。将转化投射到基本类型

    Long l = new Long(15);
    Object o = l;

将对象类型转换为基元时,它将缩小然后取消装箱

    double d1=(double)o; 

在上面的语句中我们试图将Object缩小为Double ,但由于实际值为Long 所以在运行时它会抛出 ClassCastException ,根据 5.1.6中定义的缩小转换规则。缩小参考转换

将Long Type转换为double时,它会执行取消装箱然后加宽

    double d2 =(double)l; 

首先通过调用longvalue()方法取消装入Long值,然后从long扩展到double,这可以没有错误。

答案 1 :(得分:1)

如果您不确定对象将是哪种数字类型,那么我建议您使用以下代码段:

double d = 0.0;
if (obj instanceof Number) {
    d = ((Number) obj).doubleValue();
}

答案 2 :(得分:0)

首先检查Object是否为instanceof Long,然后调用Long obejct的valueOf

段:

static double convertDouble(Object longValue){
        double valueTwo = -1; // whatever to state invalid!

        if(longValue instanceof Long) 
           valueTwo = ((Long) longValue).doubleValue();

        System.out.println(valueTwo);
          return valueTwo;
     }

答案 3 :(得分:0)

您尝试将Object转换为double,因为convertDouble的参数为Type对象。因此,自动拆箱将不起作用。有两种解决方案: 首先,将对象强制转换为Long(使用instanceof检查) 第二,使用Long作为参数

public static void main(String[] args) {
    Long longInstance = new Long(15);
    Object value = longInstance;
    convertDouble(value);
}

static double convertDouble(Long longValue){
    double valueTwo = (double)longValue;
    System.out.println(valueTwo);
    return valueTwo;
}

如果要使用convertDouble方法转换不同类型的参数,则可以使用instanceof进行检查,然后将Object转换为类型,最终得到

答案 4 :(得分:0)

这个方法不是很高效,但可以将任何数字对象转换为常见的 java.lang 对象(字节、短整数、长整数、浮点数和双精度)。

这使用反射来调用 Number 类的方法(shotValue()、intValue() 等)。

不幸的是,不存在 integerValue 方法名称,因此我使用替换字符串将整数转换为 int。

希望能帮到你。

public <T extends Number> T cast(Number value, Class<T> toClass) {

    try {
        String methodName = toClass.getSimpleName().toLowerCase().replace("integer", "int") + "Value";
        Method m = Number.class.getMethod(methodName);
        return (T) m.invoke(value);
    } catch (Exception ex) {
    }
    return null;
}