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

无法将java.lang.Long转换为java.lang.Double,java,Java,我有一个方法,它将对象作为输入,如果输入是instanceOF Long,则将值转换为double值。代码如下: public static void main(String[] args) { Long longInstance = new Long(15); Object value = longInstance; convertDouble(value); } static double convertDouble(Object longValue){ d

我有一个方法,它将对象作为输入,如果输入是instanceOF 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)
请让我知道为什么它给我例外

但若直接尝试将长对象转换为double,那个么类转换也不例外

Long longInstance = new Long(15);
    double valueOne = (double)longInstance;
    System.out.println(valueOne);

这让人困惑。

首先检查对象是否为长instanceof 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;
     }

在JLS中找到解释,
表5.1下。转换为基本类型的强制转换

    Long l = new Long(15);
    Object o = l;
将对象类型转换为基本体时,它将缩小然后取消装箱

    double d1=(double)o; 
    double d2 =(double)l; 
在上面的语句中,我们试图将对象缩小到两倍,但由于实际值很长,因此在运行时,它会根据5.1.6中定义的缩小转换规则抛出ClassCastException。缩小参考转换范围

将长型转换为双精度时,将执行取消装箱,然后加宽

    double d1=(double)o; 
    double d2 =(double)l; 

它将首先通过调用longvalue()方法取消对Long值的装箱,然后从Long扩展到double,这可能没有错误。

如果您不确定对象的数字类型,我建议使用以下代码段:

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

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

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进行检查,然后将对象转换为该类型,最终您将拥有

此方法的性能不是很好,但可以将任意数量的对象转换为常见的java.lang对象(字节、短、整数、长、浮点和双精度)

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

不幸的是,不存在integerValue方法名,因此我使用替换字符串将integer转换为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;
}
public T cast(数值,类到类){
试一试{
String methodName=toClass.getSimpleName().toLowerCase().replace(“整型”、“整型”)+“值”;
方法m=Number.class.getMethod(methodName);
返回(T)m.invoke(值);
}捕获(例外情况除外){
}
返回null;
}

不能将对象强制转换为基元类型。就是这样。
((Long)longValue)。doubleValue()
@Kii,如果对象是包装类类型,那么将进行取消装箱…因为没有基元类型的对象,我想我是对的。是的,你是对的,但是如果我喜欢Long longInstance=new Long(15);双值一=(双)持续时间;然后它不会给我任何异常,而如果我将longInstance包装到Object中并做同样的操作,那么它会给ClassCastException。谢谢Sanket的回答。你非常简洁地解释了这个概念。再次感谢。