One situation where you need to cast references is if a method has a formal parameter which is a supertype of the actual parameter, then when the method is called, that reference will be widened. You have to cast the reference back to the type it was before if you want to call methods on the reference that are defined in the subclass.
Consider this example.
This will produce a compile-time error because no matter what reference type you send to equals, it will be widened to an Object reference.
The class Object does not define the method num().
So you can only call methods on o that are defined in Object.
I'm just a poor boy, I need no sympathy, because I'm easy come, easy go, little high, little low, little ad
a bit of art, as a gift, that will fit in a stocking