Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cast object (type double) to int

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 ?

like image 359
Charlie Avatar asked Mar 17 '23 15:03

Charlie


2 Answers

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.

like image 200
kinbiko Avatar answered Mar 28 '23 01:03

kinbiko


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.

like image 29
Jon Skeet Avatar answered Mar 28 '23 02:03

Jon Skeet