JAVA C# C/C++比教学:泛型
2016-06-06 15:59
405 查看
所谓泛型,便是指参数化类型
1、JAVA
java中允许使用泛型定义接口,类和方法。如
java的泛型机制是伪泛型。意味着在编译期间,所有的泛型信息都会被擦掉。即所谓的类型擦除。
类型擦除只通过类型参数合并,将泛型类型的实例关系到同一个字节码上。
如
中,A被直接替换为了object
由于隐蔽类型擦除的问题,出现了很多灵异结果。
java中泛型必须是类,不能是基本类型。
2、C#
当编译器遇到泛型的定义时,会将泛型转化为独特的IL代码,如
public CompareUtil(T itemOne, T itemTwo)会被转化为:
当程序调用该方法时,会根据类型实参将IL由JIT转化为本机代码。本地代码中只涉及实际的参数类型。
3、C/C++
C++在编译时,做法是根据函数的调用代码,分别生成几个传入参数不同的函数。这显然会带来代码膨胀的问题。
1、JAVA
java中允许使用泛型定义接口,类和方法。如
//泛型方法 public <T1, T2> void printPoint(T1 x, T2 y){ T1 m = x; T2 n = y; System.out.println("This point is:" + m + ", " + n); } //泛型类 class Point<T1, T2>{ }
java的泛型机制是伪泛型。意味着在编译期间,所有的泛型信息都会被擦掉。即所谓的类型擦除。
类型擦除只通过类型参数合并,将泛型类型的实例关系到同一个字节码上。
如
interface Comparable <A> { public int compareTo( A that); }
中,A被直接替换为了object
由于隐蔽类型擦除的问题,出现了很多灵异结果。
java中泛型必须是类,不能是基本类型。
2、C#
当编译器遇到泛型的定义时,会将泛型转化为独特的IL代码,如
public CompareUtil(T itemOne, T itemTwo)会被转化为:
GenericTest.CompareUtil`1<([mscorlib]System.IComparable) T> `1表示元数,也就是类型参数的数量 <([mscorlib]System.IComparable) T>就是我们加在泛型类型上的类型约束 !T和!0 !T就是类型参数的占位符 !0代表第一个类型参数(当泛型的元数为2时,!1就代表第二个类型参数)
当程序调用该方法时,会根据类型实参将IL由JIT转化为本机代码。本地代码中只涉及实际的参数类型。
3、C/C++
C++在编译时,做法是根据函数的调用代码,分别生成几个传入参数不同的函数。这显然会带来代码膨胀的问题。
//泛型函数的写法 template <typename T> int compare(const T &v1, const T &v2) { if(v1 < v2) return -1; if(v2 < v1) return 1; return 0; } //泛型函数的实际调用 int a = 1, b = 0; cout << compare(a, b) << endl; double x = 2.1, y = 3.3; cout << compare(x, y) << endl; string s1 = "hi", s2 = "world"; cout << compare(s1, s2) << endl; //泛型函数在编译中会被等效为 int compare(const int &v1, const int &v2) { if(v1 < v2) return -1; if(v2 < v1) return 1; return 0; } int compare(const double &v1, const double &v2) { if(v1 < v2) return -1; if(v2 < v1) return 1; return 0; } int compare(const string &v1, const string &v2) { if(v1 < v2) return -1; if(v2 < v1) return 1; return 0; }
相关文章推荐
- C/C++中extern关键字详解
- c++ 文件操作
- 重构-C++实现矩阵的简单实例
- C语言二叉树求叶子数
- 面试题2:C++实现Singleton单例模式
- C++定义动态数组
- 源码中含有 '\357' '\273' '\277' 处理方法
- C语言的标准和Gcc遵循标准
- 深度探索C++关键字之 virtual
- 栈帧
- 字典树的c++实现
- C++第七次作业
- 第14周项目1--排序函数模板
- C++第七次做作业
- 【C++】 二叉树的基本知识及其遍历
- C语言 定义变量(右左法则)
- C++命名空间实现MD5加密
- C语言解字符串逆序和单向链表逆序问题的代码示例
- C++第七次实验
- C++编译与链接(0)-.h与.cpp中的定义与声明