您的位置:首页 > 编程语言 > C语言/C++

JAVA中的泛型和C++中的模板不一样

2013-04-15 13:09 731 查看
c++的模板,就如同模板这个词字面上的意思一样,属于字符的替代过程

比如有一个模板函数

template <typename T>

void foo(T t) {

t.bar();

}

那么这个可以编译。不过你使用这个函数的时候,T必须是包含bar函数的类

java 则不行

static <T> void foo(T t) {

t.bar();

}

这个是通不过编译的,因为编译器只知道T是一种Object,不知道T的具体类型。

你甚至不能写T t = new T(); 因为在这个方法定义的时候,编译器也不能保证T是有构造函数的

因为c++的模板做事方式是字符串的替代,所以模板参数是int等基本类型是完全没有问题的。

java则不允许int等基本类型作为泛型参数。比如ArrayList<int>是不可以的

java 有covariance 和 contravariance

也就是也可以写一个泛型方法,限定泛型参数是某一个具体的类的子类,比如

static <T> void foo(List<T extends Object> list)

这将能够接受List<String>作为参数,如果只写List<Object>,那是不能将List<String>作为参数传给他的

c++没有这种机制

 

-------------------------------------------------------------------------------------------------------------------

作为参数化类型的实现,Java的泛型和C++的模板的设计目标看起来比较像,使用起来的语法有类似之处,但是内部实现的原理完全不同。

C++的模板特性是是编译时对于给定的不同的模板类型参数生成对应版本的目标代码。而Java中的泛型是用类型擦除实现的语法糖,实际上在编译期类型检查以外,生成目标代码的过程中根本不区分泛型的类型参数,只不过针对object(而不是类型参数)生成代码,同时在必要处插入从object到给定的类型参数的类型转换而已(也因此类型参数不能是基本类型参数,C++模板就没这个限制),不会比手动实现显式类型转换有更高的运行期效率(不过可以在源代码中省略类型转换能稍微减少写源代码过程中的出错机会)。所以,某种意义上来说,Java的泛型是伪泛型,这也是Java中被人(例如Bruce
Eckel)批评最多的特性之一。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: