2014-12-13 65 views
4

好了,所以如果我有这样的代码演员对象(double类型)为int

double a=1.5; 
int b=(int)a; 
System.out.println(b); 

一切工作正常,但

Object a=1.5; 
int b=(int)a; 
System.out.println(b); 

运行后提供了以下错误(Eclipse不给任何错误)

java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.Integer 

不过,当我做

Object a=1.5; 
double b=(double)a; 
int c=(int)b; 
System.out.println(c); 

Object a=1.5; 
int b=(int)(double)a; 
System.out.println(b); 

没事儿一次。

为什么你必须先将它投射到double

+0

我很困惑为什么你的对象a = 1.5; double b =(double)a;'工作它将为** java.lang.Double **类而不是原始类型** double **工作。在我的日食中,你的工作部分不工作,但这个工作:'双b =(双)a;' – Saif 2014-12-14 09:11:26

+0

好吧,开始你自己的线程;) – Charlie 2014-12-14 09:53:10

回答

3

当您声明对象Object a = 1.5时,您可以通过检查System.out.println(a.getClass())来判断该对象实际上已转换为Double实例。由于拆箱约定,这可以再次投射到double。之后,double值可以转换为int

然而,从Double实例到int没有拆箱约定,因此如果您尝试这样做,运行时将发出ClassCastException。它不能直接从DoubleInteger

+1

希望你对我的编辑好,如果你不同意。 – 2014-12-13 14:35:14

3

当你从Object投下来的时候,你是unboxing的包装类型......而你基本上只能解开原来的类型。它实际上是对相关包装类型的转换,然后调用相应的xxxValue方法。所以这个:

Object x = ...; 
double d = (double) x; 

等同于:

Object x = ...; 
double d = ((Double) x).doubleValue(); 

这转换为Double如果x不是一个Double参考显然会失败。

所以你的问题的代码等同于:

Object a = Double.valueOf(1.5); // Auto-boxing in the original code 
int b = ((Integer) a).intValue(); // Unboxing in the original code 
System.out.println(b); 

希望现在是显而易见的,为什么会失败 - 因为第一行创建一个Double这你再尝试投放到Integer

1

我不确定为什么你的代码可以工作。您不应该将Object转换为'double',因为它们是不兼容的类型。将类型int转换为double也是不兼容的类型。您的第一个代码块:

double a=1.5; 
int b=(int)a; 
System.out.println(b); 

将打印“1”。你将失去小数。如果你只想打印小数点前的数字,那么你可以在打印时格式化你的double,你不需要强制类型为int。

但其他原因不起作用的原因是因为您试图转换为不兼容的类型。奇怪的是,你说最后两个代码块

Object a=1.5; 
double b=(double)a; 
int c=(int)b; 
System.out.println(c); 


Object a=1.5; 
int b=(int)(double)a; 
System.out.println(b); 

这些不应该因为不兼容的类型而起作用。

+0

他们不应该工作,我知道我应该使用'Double.parseDouble(a.toString())',但出于某种原因这可以工作。 – Charlie 2014-12-13 14:40:21

+0

我不知道如何让它运行,除了第一块代码之外,所有代码都会在编译时抛出java不兼容的类型错误。所以你甚至可以运行这些看起来很奇怪。 – ngrant 2014-12-13 14:45:14

+0

我正在使用Java 8,并且根本没有任何错误 – Charlie 2014-12-13 14:45:53