开发者社区> 问答> 正文

java子类和父类类型转换的问题?报错

第一次感觉到java的局限性,或者是说java的安全太高了

首先我知道,只有父类引用指向子类的对象,然后才可以将父类引用强制转换为子类引用

例如

Person p = new Boy()

Boy boy = (Boy)p

但是如果我写框架的时候,事先写好了执行流程,需要将一个父类引用转为子类引用则会报错,不知道是我写法有问题,还是不可能这样操作,或者有别的办法实现这个

展开
收起
爱吃鱼的程序员 2020-06-07 22:11:20 1073 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    java的确有其局限性,但应该不是你所说的这个场景

    应该是你代码写的有问题

    那我这个场景应该怎么写呢

    你这种情况,应该用接口,而不是继承。把要暴露出来的方法定义在接口,别人使用时候就不会出现转型问题了。

    男孩是人,但人未必是男孩。

    一个男童,是不是人?回答:是。所以,Boy的引用,可以看作是Person类的引用。如你所云:

    /*用创建Boy的构造方法造就出一个男孩,但其引用可以是Person类。*/Personp=newBoy();/*由于p是由创建Boy的构造方法造就出来的,所以可以将其引用转变成Boy类*/Boyboy=(Boy)p;

    但是,将一个父类引用转为子类引用,虽然编译通过,但动态执行时就会报错。这不是代码写得有问题,而是这种思维逻辑不对:

    一个人是否是男童?回答:未必。这就是你所说的情况:将一个父类引用转为子类引用,虽然编译通过,但动态执行时就会报错。所以

    /*创建一个Person类的实体(引用)*/Personp=newPerson();/*由于p是由创建Person的构造方法造就出的,尽管编译通过,但运行起来,就会停机报错*/Boyboy=(Boy)p;

    子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特。父类类型的引用只能调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的东西,是无可奈何的。因此,将父类类型的引用指向子类的对象,尽管编译通过,但在程序运行中,就会停机报错。

    理解很透彻啊

    父类必定不能转子类啊(当然你用父类引用引用的对象本身就是子类,自己转自己肯定没问题)...

    至于你出现这样的需求,不是java的问题,是在接口设计就有问题了。

    父类不能转子类嗯就是这样

    醒醒,这是面向对象的基础规则,什么时候变成安全性了

    先别写框架

     欢迎加入 java开发群262087628互相学习共同进步 

    请问:如何加入?

    逻辑不是很对,Person不是Boy专有的父类,你不能要求每个Person都能转换成Boy,可以添加一个条件pinstanceofBoy,只有当Person对象是Boy的实例的时候,才这样转换

    2020-06-07 22:11:40
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载