将对象从父类类型转换为子类

2022-09-02 09:34:32

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

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

执行后抛出 ClassCastException。然而,在研究Android软件包时,我发现了一个关于类型转换的例子,考虑到java的例子,它应该抛出一个ClassCastException

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

在此代码中,findViewById 方法返回一个 View 类对象,该对象是 EditText 类的超类之一。(从 android.view.Viewandroid.widget.EditText)代码运行良好。谁能解释我是否犯了错误或这是怎么发生的?

提前致谢。


答案 1

创建对象后,无法更改其类型。这就是为什么你不能把动物扔给狗。

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

这将工作:

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

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

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

此定义将导致 Android 创建 的实例,因此您可以将 返回的视图转换为 。你不能把它扔给其他任何不是超类型的.EditTextfindViewByIdEditTextEditText


答案 2

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

您必须先实例化子类:

Dog dog = new Dog;

我们可以将 Dog 的类的方法隐藏到其父类 Animal 中,方法是将其转换为其超类:

Animal animal = (Animal) dog;

然后,你可以将其向下转换回你的子类 Dog,因为它的子类的实例是已知的:

Dog anotherDog = (Dog) animal;