java.lang.Long无法转换为java.lang.Double。

9

我有一个方法,接受对象作为输入,如果输入是Long的实例,则将值转换为double类型。以下是代码:

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

但是当我执行上述代码时,我收到以下异常:
Exception in thread "main" java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Double
at com.datatypes.LongTest.convertDouble(LongTest.java:12)
at com.datatypes.LongTest.main(LongTest.java:8)

请告诉我为什么会出现异常。
但是如果直接将Long对象转换为double,则不会出现ClassCast异常。
Long longInstance = new Long(15);
    double valueOne = (double)longInstance;
    System.out.println(valueOne);

这很令人困惑。


你不能将一个对象转换为原始类型。就这样。 - vdolez
5
((Long) longValue).doubleValue() - SacJn
@Kii,如果对象是包装类类型,则可以进行拆箱操作... - Codebender
由于没有原始类型对象,我想我是正确的。 - vdolez
是的,你说得对。但是如果我这样做: Long longInstance = new Long(15); double valueOne = (double)longInstance; 那么它不会抛出任何异常,但是如果我将longInstance包装成Object并执行相同的操作,则会抛出ClassCastException异常。 - Bhupendra Nath
5个回答

15

在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; 
在上述语句中,我们试图将对象缩小为Double类型,但由于实际值为Long类型,因此在运行时会抛出ClassCastException异常,根据5.1.6. 缩小引用转换中定义的缩小转换规则。将Long类型转换为double时,将执行拆箱然后扩展操作。
    double d2 =(double)l; 

它将首先通过调用longvalue()方法拆箱长整型值,然后进行从长整型到双精度浮点数的扩展,这可能没有错误。


12

如果您不确定对象的数字类型,那么我建议使用此代码片段:

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

2

首先检查对象是否为Long的实例,然后调用Long对象的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;
     }

1
这种方法的性能不是很高,但可以将任何Number对象转换为普通的java.lang对象(Byte、Short、Integer、Long、Float和Double)。
这使用反射调用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;
}

1

您试图将Object转换为double,因为convertDouble的参数类型为Object。因此,自动拆箱将无法工作。有两种解决方案: 第一种,将Object强制转换为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转换为所需类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接