'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 1:[1]
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.
Solution 2:[2]
Basically you can't cast an instance of a superclass to a subclass because the instance of a subclass is not yet known. Upcasting is a sure way to prevent this exception to happen because we are now dealing polymorphism to our code.
You must instance a subclass first:
Dog dog = new Dog;
We can hide the methods of the class Dog not found to its parent class Animal by casting it to its superclass:
Animal animal = (Animal) dog;
Then you can downcast this back to your subclass Dog because the instance of its subclass is already known:
Dog anotherDog = (Dog) animal;
Solution 3:[3]
You can try this:
Base obj= new Derived();
Derived obj2= (Derived)obj;
Hope this will help.
Solution 4:[4]
public class OverridingConcept {
public static void main(String[] args) {
// Up-Casting
Parent p = new Child();
Child c = (Child) p;
c.eat();
}
}
class Parent {
void show() {
System.out.println("Parent.Show");
}
void eat() {
System.out.println("Parent.Eat");
}
}
class Child extends Parent {
void show() {
System.out.println("Child.Show");
}
void sing() {
System.out.println("Child.Sing");
}
}
Solution 5:[5]
If you want to change the parent to child then use below code.
Animal a= new Animal(); Dog d= Dog.valueof(a);
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 | |
| Solution 3 | Yash |
| Solution 4 | Bishwajit Vikram |
| Solution 5 | Shubham Khandelwal |
