Java ClassCastException整数到双精度
此代码引发此异常的原因:Java ClassCastException整数到双精度,java,classcastexception,Java,Classcastexception,此代码引发此异常的原因: public class DS3{ public static void main(String[] args) { double r = (double)((Object)4); System.out.println(r); } } 线程“main”java.lang.ClassCastException中的异常: 无法将java.lang.Integer转换为java.lang.Double
public class DS3{
public static void main(String[] args) {
double r = (double)((Object)4);
System.out.println(r);
}
}
线程“main”java.lang.ClassCastException中的异常:
无法将java.lang.Integer转换为java.lang.Double
而这个,只要运行良好:
public class DS4{
public static void main(String[] args) {
double r = (double)(4);
System.out.println(r);
}
}
两者都是试图将整数转换为双精度的,对吗?在第一个示例中,
4
自动装箱为整数
,然后不能将其转换为原语双精度
也许你想要的只是:
double r = 4;
两者都是试图将整数转换为双精度,对吗
是的,也不是
这条线
double r = (double)((Object)4);
使编译器将4
框入整数
,并且整数
不能转换为双精度
此代码段的字节码:
(double)((Object) 4)
情况如下:
// ...
5: iconst_4
6: invokestatic #2 // Method Integer.valueOf
9: checkcast #3 // class java/lang/Double
// ...
(第6行引发装箱,第9行引发异常。)
换句话说,它相当于
Object tmp = (Object) 4; // Auto-boxing to Integer
double d = (double) tmp; // Illegal cast from Integer to double.
另一方面,这里
double r = (double)(4);
4
被视为一个普通的int
,它可以被转换成一个double
第一次尝试将4转换成Integer
类型的对象,它基本上是一个包含int
值4的容器
第二次尝试只是将int
转换为double
,两者都是基本的非对象类型
您不能将对象强制转换为基元类型。您显示的两种转换,即
Object x = 4;
double r = (double)x;
及
需要不同数量的转换:
- 第二次转换需要从
到int
的单次转换double
- 第一次转换需要从
进行取消装箱转换,然后进行强制转换对象
Integer
添加另一个强制转换,如下():
你的问题是装箱和拆箱。您可以在此处了解更多信息:
4
自动装箱为Integer
,不能强制转换为double
。作为提示,4
也可以是double而不强制转换。您可以将对象强制转换为基本类型,只要它是正确的类型<代码>对象o=1;int a=(int)o代码>有效。最好不要将对象强制转换为基本体。违背了使用对象的目的。
double r = (double)(4);
double r = (double)((Integer)((Object)4));
System.out.println(r);