快速业务通道

Java、C#泛型的一些个人看法

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-03-13

  过去曾经有很长一段时间,直至现在,存在这样的一种观点,就是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方法的接口:

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

  例如如下情形:

 

  如下代码:

  这样,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#泛型,实现有创新,在虚拟机级别支持,运行时支持泛型,性能有提升,但是不好编写泛型算法,不向后兼容。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号