从父类到子类的类型转换

mwb*_*mwb 13 java polymorphism android types casting

我对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.Viewandroid.widget.EditText)代码运行正常.任何人都可以解释我是否犯了错误或者这是怎么回事?

提前致谢.

Era*_*ran 18

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

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

这将有效:

Animal a = new Dog ();
Dog d = (Dog) a;
Run Code Online (Sandbox Code Playgroud)

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

<EditText
    android:id="@+id/edit_message"
 ..."/>
Run Code Online (Sandbox Code Playgroud)

此定义将导致Android创建一个实例EditText,因此您可以将返回的视图转换findViewByIdEditText.你不能把它投射到任何不是超类型的东西上EditText.


Rit*_*rja 5

基本上你不能将超类的实例转换为子类,因为子类的实例尚不清楚。Upcasting 是防止这种异常发生的可靠方法,因为我们现在正在处理代码的多态性。

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

Dog dog = new Dog;
Run Code Online (Sandbox Code Playgroud)

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

Animal animal = (Animal) dog;
Run Code Online (Sandbox Code Playgroud)

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

Dog anotherDog = (Dog) animal;
Run Code Online (Sandbox Code Playgroud)