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.View到android.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,因此您可以将返回的视图转换findViewById为EditText.你不能把它投射到任何不是超类型的东西上EditText.
基本上你不能将超类的实例转换为子类,因为子类的实例尚不清楚。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)
| 归档时间: |
|
| 查看次数: |
25025 次 |
| 最近记录: |