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

我有一个方法,它将对象作为输入,如果输入是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:

 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的exception即将到来。

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

这令人困惑。

在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,这可以没有错误。

首先检查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; }