Java中鲜为人知的缺点(中)

王朝java/jsp·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

无法生成通用类

在Java中无法生成适用于各种Class(类)的通用类。具有C++编程经验的人员对此尤其感觉不便。

[[The No.1 Picture.]]

图4●模板的功能。如果是符合条件的类型,无论是Class(类)型还是数值型均可使用模板类(template class)的功能。

C++利用被称为模板(参数化类型)的功能实现这一点(图4)。生成类和函数时,不需使用特定的类,而使用包含类的模板描述处理过程(注1)。就是说只要具有在模板中调用的方法和运算符,无论何种类型的对象都可以使用模板(LIST 4)。

down cast(向下强制类型转换)难以理解,而且危险

不能使用模板的语言在编程时就会经常受到数据类型的制约。下面以Java为例,对此加以说明。对象保存在(上)篇中提到的Vector类中(LIST 5(点击放大显示))。

首先,生成String类的对象,并将其追加到Vector类中。然后提取Vector类中的初始要素。此时明确地利用String类对该方法的返回值进行类型转换(cast)。如果没有这种类型转换,编译时就会产生错误。因为暂时保存在Vector类中的对象只能处理成对象型。

追加这种类型转换从2个角度来讲是不合理的。很清楚在Vector类中的要素中本来就只有"类型"的信息。而编程者则必须一个一个重新进行类型转换。由于需要进行多余的描述,因此代码就会无谓地增加。

另一个问题是,这种操作实际上隐藏着一定的危险。在LIST 5中,将由Vector类中取得的对象定为String类型后进行了类型转换。这种转换并非永远都适用。假如在这个Vector类中由外部追加了类型完全不同的(也并非是指继承了String类)对象,由于类型不一致,因此不仅无法进行类型转换,还会发生错误。

如上所述,down cast(向下强制类型转换)就是指将位于继承关系中上层的类(这里指Object类)转换成其派生的类(这里指String类)。由于down cast伴随着这种危险,因此在编程时就应该尽量予以避免。但是,在使用像Vector类这样的Collection类时这种转换就将无法避免。

Java的这种缺点据称不久将得到解决。负责修订Java语言规格的的JCP组织(Java Community Process)计划在Java中导入类似于C++模板的Generics。具体的时间并不明确,但估计在Java 2 SDK 1.5以后导入。

[[The No.2 Picture.]]

LIST 4●C++中部分模板代码。为了将各种类型总称起来,使用了名为T的变量。如果有需要将其值加倍的类,就在T部分中指定类名来生成模板类。不过这种模板只能由具有运算符的类来使用。如果其他类使用这种模板,就会产生编译错误

[[The No.3 Picture.]]

LIST 5●Java中将字符串对象的数据保存到Vector类中的代码。取值时必须进行类型转换

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航