关于java、C#泛型的看法


======================================================
注:本文源代码点此下载
======================================================

过去曾经有很长一段时间,直至现在,存在这样的一种观点,就是c#比java的实现更漂亮。《think in java》的作者bruce eckel曾经公开质疑过java 5提供的泛型。不过说实在,我一直不喜欢看bruce eckel的书,感觉上他不是一个有经验有深度的技术人员。

我也很长一段实现认同这样的观点,因为人云亦云!

在c# 2.0支持泛型,而且在虚拟机级别支持,一开始接触时,感觉是很震撼的,感觉到泛型从此走入主流应用开发了。和c++相比,没有c++模板那样强的功能,完全做不到产生式编程的效果,也做不到编译期计算的效果,但是它简单实用。

java 5也开始支持泛型,而且最终正式发行比c# 2.0要早,我之前就使用过beta版本c#的泛型,也熟悉c++的模板语法,可能是内心的傲慢,或者是懒惰,开始时只是将就着按照传统的经验使用java 5提供的泛型。

对事物的一知半解总是令人困扰的,在阅读分析jdk源码时,总会遇到一些java 5额外提供的泛型用法,一开始忽略不计,但是看多了总会注意到的。

例如java.util.collections类中的sort方法和binarysearch方法的接口:

public static t> void sort(listt> list, comparator super t> c);

public static t> int binarysearch(list extends comparable super t>> list, t key);

extends和super这两个关键字是c#和c++的泛型中都没有的,为什么需要这样的功能呢?

例如如下情形:

class a { }

class b extends a {}

void addall(lista> items) {}

如下代码:

lista> alist = ;

listb> blist = ;

addall(alist); //可以

addall(blist); //编译不通过

addall(blist)是无法编译通过的,这一点在java、c#、c++中都是如此,怎么办呢?在java中如下处理,修改addall的接口,改为:

void addall(list extends a> items) {}

这样,addall(alist)和addall(blist)都能够编译通过了。

另外super关键在算法中更是好用,如上面介绍的collections.sort方法。如果你想在c#中实现一个和java.util.collections.sort一样的方法,你会发现那是做不到的!

为什么c#和c++无法提供这样的功能呢?因为c#和c++都是运行时的泛型支持,blist和alist的类型是不一样的,list和list的实际类型都是不一样的,运行时对泛型的支持目前还无法象处理数组参数那样具备协变能力。而java的实现是编译器的特性,这样做的缺点就是性能没有得到提升,但是可以提供更好的语法糖。

想起ajoo以前发表的一个观点,就是在应用开发中,泛型提供的关键是类型安全,性能反而是其次。我对此十分认同,重新审视java的泛型,我们会发现其设计颇具创新,而且向后兼容良好!

总结一下我的观点:

java的泛型,语法有创新,更好用,向后兼容,编写泛型算法更方便,但是没有带来性能提升。

c#泛型,实现有创新,在虚拟机级别支持,运行时支持泛型,性能有提升,但是不好编写泛型算法,不向后兼容。


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值