下传与运行时的类型鉴别

由于“上传”(沿着继承关系向上移动)之后,类的具体信息丢了,因此“用下传——也就是沿着继承关系重新向下移动——来提取类型的信息”就成了顺理成章的事情了。你知道上传总是安全的;基类的接口不可能比派生类的更大。因此它肯定能收到那些通过基类接口发送的消息。但是碰到下传的时候,你就不能肯定“这个形状是不是圆了”(只是举个例子)。它可以是一个三角形,一个矩形或是其它什么形状。

要想解决这个问题,必须要有办法能够确保下传是正确的,这样你就不会把对象误传给另一个类型了,于是也不会向它发送什么它不能接受的消息了,这是相当不安全的。某些语言(像C++)需要经过使用特别处理,才能安全地进行下传。但是Java类型传递要经过检查!所以,尽管看上去只是用一对括号做了些普通的类型转换,但是运行的时候,系统会对这些转换做检查,以确保它确实是你想要的转换类型。如果不是,你就会得到一个classcastException。这种运行时的类型检查被称为“运行时的类型鉴别”。

«1»