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

Java、C#泛型的一些个人看法,第1张

Java、C#泛型的一些个人看法,第2张

过去很长一段时间,直到现在,都有一种观点认为C#比Java好看。《用java思考》的作者布鲁斯·埃凯尔曾经公开质疑Java 5提供的泛型。但说实话,我一直不喜欢布鲁斯·埃凯尔的书,感觉他不是一个有经验有深度的技术人员。

我也认同这个观点很久了,因为大家都认同!

在C# 2.0中,虚拟机级别支持泛型。一开始我觉得很震惊,觉得泛型从此进入了主流应用开发。与C++相比,它不具备C++模板的强大功能,完全达不到生产编程或编译时计算的效果,但简单实用。

Java也开始支持泛型,最终的正式发布早于C# 2.0。我之前用过C#泛型的测试版,也熟悉C++的模板语法。可能是我内心的自大,也可能是懒惰。一开始我会按照传统的经验,只使用Java 5提供的泛型。

一知半解的事情总是让人不安。在阅读和分析JDK源代码时,你总会遇到Java 5提供的一些额外的通用用法,这些用法一开始会被忽略,但读多了总会注意到。

例如,java.util.Collections类中sort方法和binarySearch方法的接口:

公共静态void排序(List list,Comparator c);
public static int binary search(List > List,T key);


在C#和C++的泛型中找不到关键字extends和super。为什么需要这样的功能?

例如,以下情况:

A类{ }
B类扩展A {}
void addAll(列表项){ }


下面的代码:

list list =;
List bList =;
addAll(list);//Yes
addAll(bList);//编译不通过
addAll(bList)编译不通过。Java、C#和C++都是如此。我该怎么办?在java中,将addAll的接口修改为:
void addAll(列表项){}


这样addAll(list)和addAll(bList)都可以编译通过。

此外,超级键在算法中更有用,比如上面介绍的Collections.sort方法。如果你想用C#实现和java.util.Collections.sort一样的方法,你会发现你做不到!

为什么C#和C++不能提供这样的功能?因为C#和C++在运行时都支持泛型,所以bList和List的类型不同,List和List的实际类型也不同。目前运行时对泛型的支持还不能像对数组参数那样共变。但是,Java的实现是编译器的一个特性。这样做的缺点是性能没有得到提升,但是可以提供更好的语法糖。

我想起ajoo之前的观点,在应用开发中,泛型提供的关键是类型安全,性能是第二位的。这点我很赞同。重新审视java的泛型,会发现它的设计相当具有创新性和向后兼容性!

总结一下我的观点:

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

# C泛型具有创新的实现,在虚拟机级别和运行时受支持。它的性能得到了提高,但是不容易编写泛型算法,并且不是向后兼容的。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » Java、C#泛型的一些个人看法

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情