将对象(类型为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
?
当您声明对象Object a = 1.5
您可以通过检查System.out.println(a.getClass())
判断该对象实际上是否转换为Double
实例。 由于取消装箱约定,这可以再次转换为double
。 之后, double
值可以转换为int
。
但是,没有从Double实例转换为int
取消装箱约定,因此如果尝试执行此操作,运行时将发出ClassCastException
。 它不能直接从Double
为Integer
。
当您从Object
,您将从包装器类型中取消装箱 …并且您只能取消装箱到原始类型。 它实际上是对相关包装器类型的xxxValue
,然后调用适当的xxxValue
方法。 所以这:
Object x = ...; double d = (double) x;
相当于:
Object x = ...; double d = ((Double) x).doubleValue();
如果x
不是对Double
的引用,则转换为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
。
我不确定你的代码为什么会起作用。 您不应该将Object强制转换为’double’,因为它们是不兼容的类型。 另外将int类型转换为double是不兼容的类型。 你的第一个代码块:
double a=1.5; int b=(int)a; System.out.println(b);
将打印“1”。 您将丢失小数。 如果您只想在小数点前打印数字,那么您可以在打印时格式化双精度,并且不需要强制转换为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);
由于类型不兼容,这些应该不起作用。