C# vs Java 泛型
我听说泛型的Java实现不如C#实现好。在语法看起来很相似的情况下,Java实现的不合格之处是什么,或者它是宗教观点?
我听说泛型的Java实现不如C#实现好。在语法看起来很相似的情况下,Java实现的不合格之处是什么,或者它是宗教观点?
streloksi的链接在打破差异方面做得很好。快速而肮脏的摘要虽然是...
在语法和用法方面。两种语言之间的语法大致相同。这里和那里的一些怪癖(最明显的是约束)。但基本上,如果你能读懂一个,你就有可能读/使用另一个。
但最大的区别在于实现。
Java 使用类型擦除的概念来实现泛型。简而言之,基础编译类实际上并不是泛型的。它们编译为对象和强制转换。实际上,Java 泛型是一个编译时工件,很容易在运行时被颠覆。
另一方面,C#通过CLR,实现了泛型,一直到字节码。CLR 进行了一些重大更改,以支持 2.0 中的泛型。其优点是性能改进、深度类型安全验证和反思。
同样,提供的链接有一个更深入的细分,我鼓励你阅读
这种差异归结为微软和Sun的设计决策。
Java 中的泛型由编译器通过类型擦除实现,这意味着类型检查在编译时进行,并且类型信息被删除。采用此方法是为了使用泛型保持旧代码与新代码兼容:
来自 Java 教程,泛型:类型擦除:
实例化泛型类型时,编译器通过一种称为类型擦除的技术转换这些类型,该擦除是编译器删除与类或方法中的类型参数和类型参数相关的所有信息的过程。类型擦除使使用泛型的 Java 应用程序能够保持与 Java 库和泛型之前创建的应用程序的二进制兼容性。
但是,对于 C# (.NET) 中的泛型,编译器不会进行类型擦除,并且类型检查是在运行时执行的。这样做的好处是类型信息保留在编译的代码中。
来自维基百科:
利用此设计选择来提供其他功能,例如允许通过保留泛型类型进行反射,以及减轻擦除的一些限制(例如无法创建泛型数组)。这也意味着运行时转换和通常昂贵的装箱转换不会对性能造成影响。
与其说“.NET泛型比Java泛型更好”,不如研究一下实现泛型的方法的差异。在Java中,保持兼容性似乎是一个高优先级,而在.NET(在2.0版引入时),实现使用泛型的全部好处是更高的优先级。