学霸笔记-一文理解cast转换

写在前边

我相信以上的结论大家不止在一篇文章中见到,但是当自己使用cast的时候,嗯......,不是转换不成功就是会报类型不匹配的问题。后来发现,靠,我居然还是不会。不好意思,以上内容根据自己亲身经历演变而来。咱们言归正传,本文将主要针对以上结论中的红色字体内容进行深入剖析,解释。

1. what?又报错:

上来就是一个报错场景,这就是没有彻底理解以上结论造成的(如果转换源类型与目的类型所指向对象的类型一致或者是目的类型指向的对象是源类型的父类,那么可以使用$cast进行转换);以下代码声明了一个父类father,一个继承于father的子类child1。按照最初的理解,目的类型指向的对象是源类型的父类,不就是下边的cast转换吗?但是,偏偏会报错,这是为什么呢?

仿真结果:

报错信息是类型不匹配, 究竟是什么原因导致的呢?

2. 靠,难道是这样?

请允许我将以上的继承关系画出来,这可能有助于我们找到答案。 

以上图片其实就想说明一个问题,father = new(),开辟的空间是左边的只有father的空间,但是child1=new()开辟的空间除了包含有child自身的(图上表示为child1拓展部分),还有其父类father的部分。以上代码首先对father进行了实例化,开辟了空间,接着进行$cast(子类句柄,子类句柄的父类对象)转换,这是不被允许的。其实上边结论说的目的类型指向的对象是源类型的父类是可以进行cast转换的,指的是$cast(子类句柄,子类里边父类的对象(右边图的father部分),而不是左边的father)。

3. 小试牛刀

将原始代码进行了修改,主要在top部分,首先初始化子类,开辟空间,父类句柄指向子类对象,这是允许的。此时,父类指向的是子类空间中父类的那一部分空间,如打印结果所示。但是其所属的类型为子类。接下来进行cast转换就不存在上边的问题了。看了打印结果,心头一紧,真TMNB,这个理解就目前而言可以说服自己了。

4. 实际中的“坑”

 这部分代码放到附件了,是自己实际工作中遇到的一个小问题,最初是由于cast转换引出的,但是后续debug过程中发现并非是cast的问题。

借此插眼,配置类顶层配置好了之后一定是使用句柄传到下边的层次,可千万不要在底层类中随便实例化该配置类,不然你会发现,实例化的类是一个基类,心中还会一直默念,我明明对里边的配置做了修改,为什么没有传进来的疑问,可能一弄就是一天,吐血的经历。

感兴趣的朋友可以看看具体代码,当然,其实无关紧要,我就是觉得这个问题给我搞得多多少少有点不爽,记录以下罢了;

注:优秀验证学员随堂笔记,已经征求到学生的同意,会持续给牛友们分享!

大家看完记得 一键三连!多多支持

#项目##学霸笔记##IC验证转行##秋招的第一个offer,大家都拿到了吗##高频知识点汇总#
全部评论

相关推荐

10-13 17:47
门头沟学院 Java
wulala.god:图一那个善我面过,老板网上找的题库面的
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-21 17:16
科大讯飞 算法工程师 28.0k*14.0, 百分之三十是绩效,惯例只发0.9
点赞 评论 收藏
分享
点赞 2 评论
分享
牛客网
牛客企业服务