第一次感觉到java的局限性,或者是说java的安全太高了
首先我知道,只有父类引用指向子类的对象,然后才可以将父类引用强制转换为子类引用
例如
Person p = new Boy()
Boy boy = (Boy)p
但是如果我写框架的时候,事先写好了执行流程,需要将一个父类引用转为子类引用则会报错,不知道是我写法有问题,还是不可能这样操作,或者有别的办法实现这个
顶
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的实例的时候,才这样转换
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。