我的理解是,Java中有原始类型和类型擦除的原因是因为在引入泛型的时候,有一些标准API在不破坏现有代码的情况下无法成为泛型。
泛型也在以后的某个时候引入了.NET,但是这个特性是以一种不依赖于原始类型或类型擦除的方式实现的(如果它依赖于原始类型或类型擦除,那么它是以对用户透明的方式实现的)。因此,现有的API保持不变(例如,System.Collections名称空间中的代码),而引入了新的通用API(例如,System.Collections.Generic名称空间中的代码)。
那么,与.NET泛型不同,为什么Java泛型需要原始类型/类型擦除呢?
发布于 2013-07-12 21:41:52
.Net通过更改字节码语言、虚拟机和JITter来识别泛型类型,从而引入了泛型。
这是一项耗时约两年的大量工作。
Java引入了泛型作为纯粹的编译时特性,只有很小的运行时更改(新的元数据和反射API)。
这是一项简单得多的任务,它保持了与旧运行时的向后兼容性,但使用它要麻烦得多。
发布于 2013-07-12 21:54:43
Sun特别热衷于保证向后兼容性,因为它是一个庞大的Java软件基础。要做到这一点,他们认为JVM中的最小变化是最好的。事后看来,从长远来看,这似乎不是最好的决定,因为这意味着JVM并不真正理解泛型,也无法优化许多冗余的类检查。
相比之下,Oracle不太愿意更改JVM,并且遭受了更严重的公开错误,特别是。与安全有关。(它们的意思不是一样的,但一个可以通向另一个)即便如此,Oracle只向JVM添加了一条指令,而Java甚至没有使用它,而Sun没有添加任何指令,所以它实际上是相对的。;)
另一方面,微软的C#代码库较小,客户更习惯于在主要版本之间进行重大的、甚至是破坏性的更改。这在短期内意味着更多的痛苦,但从长远来看,这可能是一个更好的选择。你有更少的问题是由于历史原因留下的。
简而言之,区别不是技术性的,而是更多的政治性和历史性。
https://stackoverflow.com/questions/17616281
复制相似问题