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