C#与Javagenerics

我听说Generics的Java实现不如C#实现。 在这个语法看起来相似的情况下,这个Java实现是不合标准的,还是它是一个宗教观点?

streloksi的链接在打破分歧方面做得很好。 快速和肮脏的总结虽然是…

在语法和用法方面。 语言之间的语法大致相同。 在这里和那里的一些怪癖(最显着的是在限制)。 但基本上,如果你可以阅读一个,你可以阅读/使用另一个。

最大的区别在于实现。

Java使用types擦除的概念来实现generics。 总之,底层的编译类实际上并不是通用的。 他们编译到对象和强制转换。 实际上,Javagenerics是一个编译时的工件,在运行时很容易被破坏。

另一方面,C#通过CLR,将generics实现到字节码。 为了支持2.0中的generics,CLR进行了几次重大更改。 好处是性能改进,深入的types安全validation和反思。

再次提供的链接有一个更深入的细分我鼓励你阅读

差异归结于微软和Sun的devise决定。

Java中的generics是由编译器通过types擦除来实现的,这意味着types检查在编译时发生,types信息被删除。 采取这种方法是为了保持遗留代码与使用generics的新代码兼容:

从Java教程, generics:types擦除 :

当genericstypes被实例化时,编译器通过称为types擦除的技术翻译这些types – 编译器在类或方法中删除与types参数和types参数相关的所有信息的过程。 types擦除使得使用generics的Java应用程序能够保持与generics之前创build的Java库和应用程序的二进制兼容性。

但是,对于C#(.NET)中的generics,编译器没有types擦除,并且types检查在运行时执行。 这样做的好处是types信息保存在编译后的代码中。

维基百科:

这种deviseselect被用来提供额外的function,比如允许reflection和保存genericstypes,以及减轻擦除的一些限制(比如不能创buildgenerics数组)。 这也意味着没有性能影响从运行时强制转换和通常昂贵的拳击转换。

而不是说“.NETgenerics优于Javagenerics”,应该研究generics实现方法的差异。 在Java中,保持兼容性似乎是高优先级,而在.NET中(2.0版引入时),实现使用generics的全部好处是更高的优先级。

综合比较这里 ,有一些链接。

也发现了这个与Anders Hejlsberg的对话,这可能也很有趣。 但是对于乔纳森·普赖尔的博客文章的答案+1。