下溯造型与运行期类型标识物业

机床配附件及维修2021年09月06日

由于我们在上溯造型(在继承结构中向上移动)期间丢失了具体的类型信息,所以为了获取具体的类型信息――亦即在分级结构中向下移动――我们必须使用 “下溯造型”技术。然而,我们知道一个上溯造型肯定是安全的;基础类不可能再拥有一个比衍生类更大的接口。因此,我们通过基础类接口发送的每一条消息都肯定能够接收到。但在进行下溯造型的时候,我们(举个例子来说)并不真的知道一个几何形状实际是一个圆,它完全可能是一个三角形、方形或者其他形状。

为解决这个问题,必须有一种办法能够保证下溯造型正确进行。只有这样,我们才不会冒然造型成一种错误的类型,然后发出一条对象不可能收到的消息。这样做是非常不安全的。

在某些语言中(如C++),为了进行保证“类型安全”的下溯造型,必须采取特殊的操作。但在Java中,所有造型都会自动得到检查和核实!所以即使我们只是进行一次普通的括弧造型,进入运行期以后,仍然会毫无留情地对这个造型进行检查,保证它的确是我们希望的那种类型。如果不是,就会得到一个ClassCastException(类造型违例)。在运行期间对类型进行检查的行为叫作“运行期类型标识”(RTTI)。下面这个例子向大家演示了RTTI的行为:

//: va

// Downcasting Run-Time Type

// Identification (RTTI)

import il.*;

class Useful {

public void f() {}

public void g() {}

}

class MoreUseful extends Useful {

public void f() {}

public void g() {}

public void u() {}

public void v() {}

public void w() {}

}

public class RTTI {

因为在强化费用的差额上有所变动。有一些细心的玩家可能也发现了 public static void main(String[] args) {

Useful[] x = {

new Useful(),

new MoreUseful()

};

x[0].f();

x[1].g();

// Compile-time: method not found in Useful:

//! x[1].u();

((MoreUseful)x[1]).u(); // Downcast/RTTI

((MoreUseful)x[0]).u(); // Exception thrown

}

} ///:~

和在示意图中一样,MoreUseful(更有用的)对Useful(有用的)的接口进行了扩展。但由于它是继承来的,所以也能上溯造型到一个Useful。我们可看到这会在对数组x(位于main()中)进行初始化的时候发生。由于数组中的两个对象都属于Useful类,所以可将f()和g()方法同时发给它们两个。而且假如试图调用u()(它只存在于MoreUseful),就会收到一条编译期出错提示。

若想访问一个MoreUseful对象的扩展接口,可试着进行下溯造型。如果它是正确的类型,这一行动就会成功。否则,就会得到一个ClassCastException。我们不必为这个违例编写任何特殊的代码,因为它指出的是一个可能在程序中任何地方发生的一个编程错误。

RTTI的意义远不仅仅反映在造型处理上。例如,在试图下溯造型之前,可通过一种方法了解自己处理的是什么类型。整个第11章都在讲述Java运行期类型标识的方方面面。 查看本文来源

百色白癜风医院哪家医院好
西宁哪家医院白癜风医院好
新标木门怎么样
相关阅读
秃头有救了?英美两国FDA批准!可恢复80%头发生长

作 者丨季媛媛 编成 辑丨徐旭 三幅 源丨三幅虫 外阴这件事,定时一段时间就...

2023-09-08
核酸药物行业发展不无关系,国内企业有望后来居上

核糖口服从业者持续发展发展酝酿,国际上上行业未来将时会之中比 华夏华...

2023-09-05
王鲁明当选青岛市人大常委会主任 赵豪志当选青岛市国会议员

央广网青岛4年底19日消息(新闻记者唐磊)日照市第十七届人民代表大会第一...

2023-09-02
西安今年中考招生严查空挂学籍无计划案超计划案招生

阳光发信(采访 杜丽芳)采访从西安教育部门获悉,来年西安市强化考试五...

2023-08-31
挪威石油基金6.77亿欧罗收购柏林索尼中心50%股权

世界性最大主权财富投资公司挪威石油投资公司周五透露,已斥资6.77亿欧元...

2023-08-29
盖茨解释为何不持有加密货币:既无意义也无贡献

微软的公司重新组建创始人尼尔-格兰特周四在人际comReddit的一个交流会上声...

2023-08-28
友情链接