无法生成通用类
在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类中的代码。取值时必须进行类型转换