为啥我不能在某些特定情况下将父母投射到孩子身上

Posted

技术标签:

【中文标题】为啥我不能在某些特定情况下将父母投射到孩子身上【英文标题】:why i can not cast parent to child some specific scenario为什么我不能在某些特定情况下将父母投射到孩子身上 【发布时间】:2021-09-09 02:28:19 【问题描述】:

我有两个班级,一个动物和一个熊。 示例代码

class Animal 
class Bear extends Animal 

当我写代码时

Animal animal = new Bear();
Bear bear = (Bear) animal;

我也知道第一个是向上转换,第二个是向下转换并且工作正常。

但我的问题是当我编写如下代码时:

Animal animal = new Animal();
Bear bear = (Bear) animal;

它通过ClassCastException

我想知道为什么会这样。

【问题讨论】:

【参考方案1】:

Java 中的强制转换不能更改对象类型。它只是告诉编译器将某个对象视为某种类型是可以的,因为在运行时会出现这种情况。

在第一个示例中,bear 确实是 Bear 实例,因此转换工作正常。 在第二个例子中,它不是,所以你得到一个ClassCastException

【讨论】:

【参考方案2】:

如果Bear 类型的第23 个方法是growl,并且bear 是函数中的第5 个局部变量,Java 编译器会将bear.growl() 转换为“执行局部变量#5 的方法#23” .如果对象实际上是类Bear 的实例或派生类型是方法#23 是growl(),这样的翻译会很好,但如果引用是某种没有@987654327 的类型,则可能是灾难性的@ 作为方法#23。如果对象没有方法 #23,则 JVM 可能能够在函数调用时捕获此类问题,但如果对象是例如,则不太可能捕获它们。一个Dragon,其方法#23 是breatheFire()。与其要求每次尝试对Bear 类型的变量使用方法growl,不如检查以确保对象实际上具有growl 作为方法#23,Java 禁止存储方法#23 不是@987654333 的任何引用@ 转换为 bear 类型的变量。

【讨论】:

【参考方案3】:
Animal animal = new Animal();
Bear bear = (Bear) animal;

这是因为您的父类不知道您孩子的属性和方法。 在第一行中,您只是创建了一个 animal 对象,仅此而已。如果要强制转换此动物引用,则必须将子对象分配给它,以便您的父引用也知道子对象的属性和方法。 这必须替换为

Animal animal = new Bear();
Bear bear = (Bear) animal;

【讨论】:

以上是关于为啥我不能在某些特定情况下将父母投射到孩子身上的主要内容,如果未能解决你的问题,请参考以下文章

NLP智慧父母 | 我在孩子身上看见了什么?

为啥我无法捕捉到父母发送的孩子的信号?

如何在可扩展的listview android中将孩子添加到特定的父母

如何使用reactjs解析从孩子到父母的数据?

根据父母的边界半径裁剪孩子

jquery选择器需要选择父母的所有某些孩子