首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这种向上转换不起作用?

为什么这种向上转换不起作用?
EN

Stack Overflow用户
提问于 2009-06-18 11:19:59
回答 5查看 1.5K关注 0票数 1

我有两个类别测试(基础)和程序(孩子)。现在我在下播的时候遇到了一些问题。

代码语言:javascript
复制
        Test t = new Program();// upcasting-works
        Program p = (Program)t;//Downcasting-works
        Program q = (Program)new Test();//Downcasting -throws exception.

我想知道它为什么抛出异常?这可能是非常基本的,但不知何故,我不明白。是为那个新对象准备的吗?

谢谢。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-06-18 11:27:10

这是所有面向对象系统的预期行为。简而言之,您不能向下转换为动态类型不匹配的对象。在这一行中:

代码语言:javascript
复制
Program q = (Program)new Test();

您正在创建一个Test实例-该实例显然与Program不匹配,因为Test不是从Program派生的。在运行时,计算机检测到这种情况,并抛出异常。

另一方面,你有:

代码语言:javascript
复制
 Test t = new Program();

在这里,您正在创建一个Program实例-该实例与Test匹配,因为Program确实派生自Test

最后,也是无序的,你需要:

代码语言:javascript
复制
Program p = (Program)t;

在本例中,t是对Test的引用,但底层类型实际上是Program -在运行时,计算机能够确定是这种情况,因此允许强制转换工作。

票数 7
EN

Stack Overflow用户

发布于 2009-06-18 11:24:47

每个正方形都是矩形,但反之亦然。类似地,派生类的每个实例都是基类的有效实例,但反之亦然。在您的示例中,每个Program都是Test,但并不是所有的Test都是Program

注意:为了澄清,这并不意味着你应该继承OOP中的Rectangle的Square :)这只是一个类比。具有讽刺意味的是,这种类比在面向对象设计中是一个众所周知的问题。

票数 6
EN

Stack Overflow用户

发布于 2009-06-18 11:26:05

问题是:Test实例不是a Program。它适用于第一种情况,因为实例是作为Program创建的(在第一行)。

对于强制转换,实际对象的类型(而不仅仅是变量)很重要。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1012122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档