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 declare the object Object a = 1.5
you can tell by checking System.out.println(a.getClass())
that the object is in fact cast to a Double
instance. This can again be cast to a double
because of unboxing conventions. After that the double
value can be cast to an int
.
There are however no unboxing conventions to cast from a Double instance to an int
, so the runtime will issue an ClassCastException
if you try and do that. It cannot directly go from Double
to Integer
.
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
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With