从父类到子类的类型转换

时间:2014-08-07 22:04:03

标签: java android types casting polymorphism

我对Java语言中的类型转换有误解。问题是 ClassCastException 。例如,在此代码中,假设Animal是Dog类的父类,

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

执行后抛出 ClassCastException 。 但是,在研究android包时,我发现了一个关于类型转换的例子,它应该抛出一个 ClassCastException ,考虑到这个例子。

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

在此代码中, findViewById 方法返回 View 类对象,该对象是 EditText 类的超类之一。(来自 android.view.View android.widget.EditText )代码运行正常。任何人都可以解释我是否犯了错误或者这是怎么发生的?

提前致谢。

4 个答案:

答案 0 :(得分:17)

创建对象后,您无法更改其类型。这就是为什么你不能把动物变成狗的原因。

但是,如果创建子类的对象,则可以在超类类型的变量中保留对它的引用,稍后可以将其强制转换为子类类型。

这将有效:

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

在Android示例中,您有一个如下所示的布局资源:

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

此定义将导致Android创建EditText的实例,因此您可以将findViewById返回的视图转换为EditText。您不能将其投放到任何不属于EditText的超类型的其他内容。

答案 1 :(得分:3)

基本上,您不能将超类的实例强制转换为子类,因为尚未知道子类的实例。上传是防止此异常发生的可靠方法,因为我们现在正在处理代码中的多态性。

您必须首先实例化一个子类:

Dog dog = new Dog;

我们可以通过将类强制转换为超类来隐藏未找到其类Parent的类的方法:

Animal animal = (Animal) dog;

然后你可以将它转发回你的子类Dog,因为它的子类的实例已经知道了:

Dog anotherDog = (Dog) animal;

答案 2 :(得分:1)

您可以尝试以下方法:

Base obj= new Derived();
Derived obj2= (Derived)obj;

希望这会有所帮助。

答案 3 :(得分:0)

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");
    }
}