ClassCastException 整数加倍
ClassCastException Integer to Double
为什么这段代码抛出这个异常:
public class DS3{
public static void main(String[] args) {
double r = (double)((Object)4);
System.out.println(r);
}
}
Exception in thread "main" java.lang.ClassCastException:
java.lang.Integer cannot be cast to java.lang.Double
而这个 运行 很好:
public class DS4{
public static void main(String[] args) {
double r = (double)(4);
System.out.println(r);
}
}
两者都是尝试将整数转换为双精度,对吗?
在您的第一个示例中,4
被自动装箱为 Integer
,然后无法转换为原始类型 double
。
也许你想要的只是:
double r = 4;
Both are a attempt to convert integer to double, right?
是,也不是。
这一行
double r = (double)((Object)4);
导致编译器将 4
装在 Integer
中,并且 Integer
无法转换为双精度数。
此片段的字节码:
(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;
和
double r = (double)(4);
需要不同的转化次数:
- 第二次转换需要从
int
到 double
、 的单个转换
- 第一次转换需要从
Object
进行拆箱转换,然后进行转换。
Java 转换运算符一次只执行一次转换。
要使第一个转换生效,您必须向 Integer
添加另一个转换,像这样 (demo):
double r = (double)((Integer)((Object)4));
System.out.println(r);
您的问题是关于装箱和拆箱的。您可以在此处阅读更多相关信息:https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html
为什么这段代码抛出这个异常:
public class DS3{
public static void main(String[] args) {
double r = (double)((Object)4);
System.out.println(r);
}
}
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Double
而这个 运行 很好:
public class DS4{
public static void main(String[] args) {
double r = (double)(4);
System.out.println(r);
}
}
两者都是尝试将整数转换为双精度,对吗?
在您的第一个示例中,4
被自动装箱为 Integer
,然后无法转换为原始类型 double
。
也许你想要的只是:
double r = 4;
Both are a attempt to convert integer to double, right?
是,也不是。
这一行
double r = (double)((Object)4);
导致编译器将 4
装在 Integer
中,并且 Integer
无法转换为双精度数。
此片段的字节码:
(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;
和
double r = (double)(4);
需要不同的转化次数:
- 第二次转换需要从
int
到double
、 的单个转换
- 第一次转换需要从
Object
进行拆箱转换,然后进行转换。
Java 转换运算符一次只执行一次转换。
要使第一个转换生效,您必须向 Integer
添加另一个转换,像这样 (demo):
double r = (double)((Integer)((Object)4));
System.out.println(r);
您的问题是关于装箱和拆箱的。您可以在此处阅读更多相关信息:https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html