我的理解是,Java中存在原始类型和类型擦除的原因是因为在引入泛型时,有些标准API在不破坏现有代码的情况下无法通用。
Generics也在未来的某个时候引入.NET,但是这个功能是以不依赖于原始类型或类型擦除的方式实现的(如果是这样的话,它以透明的方式实现)给用户)。因此,现有的API保持不变(例如,System.Collections命名空间中的代码)和新的通用API(例如,System.Collections.Generic命名空间中的代码)。
那么,与.NET泛型不同,Java泛型如何需要原始类型/类型擦除?
答案 0 :(得分:8)
.Net通过更改字节码语言,虚拟机和JITter来识别泛型类型,从而引入了泛型 这是一项耗时约两年的大量工作。
Java将泛型作为纯编译时功能引入,只有很小的运行时更改(新的元数据和反射API)。 这是一个更简单的任务,它保持向后兼容较旧的运行时,但使用它会更烦人。
答案 1 :(得分:3)
Sun特别热衷于保证向后兼容性,因为它是Java软件的一个大型基础。为此,他们认为JVM中最小的变化是最好的。事后看来,从长远来看,这似乎不是最好的决定,因为它意味着JVM并不真正理解泛型,也无法优化许多冗余类检查。
相比之下,Oracle不太愿意改变JVM,并且遭受了更严重的公共错误。与安全有关。 (它们并不意味着相同的东西,但是一个可以导致另一个)即便如此,Oracle只向JVM添加了一条指令,而Java甚至没有使用它,而Sun则没有添加任何指令,所以它实际上是相对的。 ;) 另一方面,微软的C#代码库较小,客户更习惯于重要版本,甚至是主要版本之间的重大变化。这意味着短期内会有更多的痛苦,但从长远来看可能是更好的选择。由于历史原因,你的问题较少。总之,差异不是技术性的,而是更具政治性和历史性。