In java:
Base b = new Base();
Derived d = (Derived)b;
throws ClassCastException
. Why? Why downcasting throws Exception
here? I could not figure out the reason.
In java:
Base b = new Base();
Derived d = (Derived)b;
throws ClassCastException
. Why? Why downcasting throws Exception
here? I could not figure out the reason.
To downcast in Java and avoid run-time exceptions, take a reference of the following code:
Here, Animal is the parent class and Cat is the child class.
instanceof is a keyword that is used for checking if a reference variable is containing a given type of object reference or not.
Let me rename your classes to make things more clear.
Base
->Animal
.Derived
->Cat
.Just because you're an
Animal
doesn't mean you're aCat
. You could be aDog
. That's why it's illegal to cast anAnimal
into aCat
.On the other hand, is every
Cat
anAnimal
? The answer is "yes". That's why you could write code like this:or
Also what's worth noting is you can do this:
The reason you can do this is that your
animal
variable is actually referencing aCat
instance. Therefore you're allowed to cast it back into a variable that references aCat
.A derived class inherits the behavior from its super class. Hence, casting a sub-class object to a super-class reference works since the derived class object is capable of fulfilling the contract defined by the super-class.
On the other hand, a super-class (by the very way you define the classes) clearly doesn't implement most of the methods present in the sub-class. Well, that's why you extended the super-class in the first place - to extend its implementation.
So, casting a super-class object to a sub-class type is an inherently unsafe operation because the base class object cannot fulfill its sub-class' contract completely.
You cannot cast a derived class as the base class. You may assign
b
as either aBase
or aDerived
, but you may only assignd
as aDerived
. Long story short, you may only assign a variable declared asBase
a value that is of the same type (Base
) or a derived type.This is okay (I'm just using
new
as an example, what matters is the data types):But this is not:
This is the way that inheritance works