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)批评最多的特性之一。
比如有一个模板函数
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)批评最多的特性之一。
相关文章推荐
- C#和Java的泛型、C++模板、C#的constraints特性以及弱类型化和强类型化的问题(转)
- Java 中的泛型与 C++ 模板的比较
- Java 中的泛型与 C++ 模板的比较
- C++“模板”和Java“泛型”
- JAVA的泛型和C++的模板的区别与联系
- C++的模板(和java的泛型一样)
- JAVA的泛型和C++的模板的区别与联系
- C++中模板和java中泛型的区别
- Java 中的泛型与 C++ 模板的比较
- C++、C#、JAVA中模板与泛型
- C#中的泛型与C++中的模板
- Java JNI由浅入深(包括:Java和C++互传ArrayList泛型对象参数)
- java类与对象的创建与使用(注意与c++的有些关键字不一样)
- C++ 模板和 C# 泛型之间的区别(C# 编程指南)
- Anders Hejlsberg谈C#、Java和C++中的泛型
- C++ 模板和 C# 泛型之间的区别
- C++ 模板与泛型(2)
- C++模板实现泛型队列
- C++泛型设计 - 模板规格(译)
- hdu4762Cut the Cake(概率+大数操作(java)+C++高精度模板)