Search code examples
javaandroidtypescastingpolymorphism

Typecasting an object from parent class to child


I have a misunderstanding about typecasting in Java language. The problem is ClassCastException. For example, in this code, assuming Animal is the parent class of the Dog class,

Animal animal = new Animal();
Dog dog = (Dog) animal;

throws ClassCastException after execution. However, while studying android packages, I found an example about typecasting which should throw a ClassCastException, considering that java example.

EditText editText = (EditText) findViewById(R.id.edit_message);

In this code, findViewById method returns a View class object, which is one of the superclasses of EditText class.(from android.view.View to android.widget.EditText) The code runs fine. Could anyone explain if I made a mistake or how this happens?

Thanks in advance.


Solution

  • Once you create an object, you can't change its type. That's why you can't cast an Animal to a Dog.

    However, if you create an object of a sub-class, you can keep a reference to it in a variable of the super-class type, and later you can cast it to the sub-class type.

    This will work :

    Animal a = new Dog ();
    Dog d = (Dog) a;
    

    In the Android example, you have a layout resource that looks like this :

    <EditText
        android:id="@+id/edit_message"
     ..."/>
    

    This definition will cause Android to create an instance of EditText, and therefore you can cast the view returned by findViewById to EditText. You can't cast it to anything else that isn't a super-type of EditText.