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

新手上路,请多包涵

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

动物动物=新动物();
 Dog dog =(狗)动物;

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

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

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

提前致谢。

原文由 mwb 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 558
2 个回答

一旦你创建了一个对象,你就不能改变它的类型。这就是为什么你不能将 Animal 投给 Dog 的原因。

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

这将起作用:

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

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

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

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

原文由 Eran 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

 Dog dog = new Dog;

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

 Animal animal = (Animal) dog;

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

 Dog anotherDog = (Dog) animal;

原文由 Ritchie Borja 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题