I was taking the self test in SCJP study guide where this code confused me.
This code throws ClassCastException when Tree is downcast to Redwood.
But I dont understand why. To try this out I used an existing code and tried upcasting and downcasting.
I dont understand how come this one is working fine.
Sorry to say, my friend, but you are mistaken; your example is not working fine. It will compile, yes, but at runtime, the line
NewTest n = (NewTest)t1; //throws no exception
absolutely will throw a ClassCastException. A cast can never actually change an object; it can only tell the compiler something that is true. So the first cast, from a NewTest object to class Test, is OK, because a NewTest is-a Test. But the second cast fails, since the object is really an instance of Test, and can't be converted to NewTet. There's a third thing you can do which does work, and I think that's the interesting case that you're missing:
Test t2 = new NewTest();
NewTest t3 = (NewTest) t2;
You can't make the second assignment without the cast, but with the cast, it's legal, since t2 really does hold a NewTest instance.
hi Ernest Friedman-Hill
thank you very much for clearing my confusion.
Actually I was thinking of collections which return Object instances that can be cast to other types.
The third thing you told about clarified everything.
thank you once again.