JAVA C# C/C++比教学:泛型

31 篇文章 0 订阅
14 篇文章 1 订阅

所谓泛型,便是指参数化类型
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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值