Okay, so if I have this code
double a=1.5;
int b=(int)a;
System.out.println(b);
Everything works fine, but
Object a=1.5;
int b=(int)a;
System.out.println(b);
gives the following error after running (Eclipse doesn't give any error)
java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.Integer
Though, when I do
Object a=1.5;
double b=(double)a;
int c=(int)b;
System.out.println(c);
or
Object a=1.5;
int b=(int)(double)a;
System.out.println(b);
Nothing's wrong again.
Why do you have to cast it to double
first ?
When you're casting from Object
, you're unboxing from the wrapper type... and you can only unbox to the original type, basically. It's effectively a cast to the relevant wrapper type, followed by a call to the appropriate xxxValue
method. So this:
Object x = ...;
double d = (double) x;
is equivalent to:
Object x = ...;
double d = ((Double) x).doubleValue();
That cast to Double
will obviously fail if x
isn't a reference to a Double
.
So your problematic code is equivalent to:
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);
Hopefully now it's obvious why that would fail - because the first line creates a Double
which you're then trying to cast to Integer
.
See more on this question at Stackoverflow