Java的泛型很像C++中的模板,说到Java 泛型和C++中的模板的关系时,有两个重要的方面需要被考虑到:语法和语义。语法看起来是相似的,可是语义却明显是不同的。
在语法上讲,选择尖括号 是因为他们对于C++用户来说是很熟悉的,而且方括号很难去解析。 但是在语法上面,他们之间有一点是不同的。在C++中, 参数需要额外的空格,就像下面一样
List< List>
在Java中,是不需要空格的,可以写成下面这个样子是:
List
>
你可以使用额外空格如果你愿意,但是这个不是必须的。(在C++中,如果没有> >之间的 空格会出现问题,但是Java会在语法中修复这个问题。)
在语义上讲,Java泛型被定义为可擦除的,而C++模板被定义为可扩展的。在C++中,每一个新类型的模板的实例被独立的编译,如果你使用整数列表字符串列表和字符串列表的列表,那么将会有三种类型的代码。如果是使用成百上千中不同类型的列表,那么将会有成百上千种版本的代码---一种熟知的问题代码膨胀。在Java中,不管你使用多少种类型的列表,那么只会有一个版本的代码。所以代码膨胀问题不会产生。
可扩展可能会更加有效率比擦除的实现方式,因为它为优化提供了更多的选择,特别是原始类型,比如int。举个例子,对于代码而言它操作大量的数据,在科学计算中的数组,这种差异会很有效率的。但是在实际中,这种效率上的差异在绝大部分的使用中不是那么重要的。然而因为这个引起的代码膨胀问题确实需要注意的。
在C++中,你可能通过一个常量的值而不是具体的类型来实例化一个模板,这样就把它当成了一个宏定义来使用过来,这样可能会导致的复杂的计算在编译的过程中。Java泛型很谨慎的限制了类型,这样可以帮助她们变得简单而且易于理解。