将对象(类型为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 。 它不能直接从DoubleInteger

当您从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); 

由于类型不兼容,这些应该不起作用。