5

我的理解是,Java 中有原始类型和类型擦除的原因是因为在引入泛型的时候,有一些标准 API 在不破坏现有代码的情况下无法实现泛型。

泛型也被引入到 .NET 中,但是这个特性的实现方式不依赖于原始类型或类型擦除(如果是这样,它以对用户透明的方式实现) )。因此,现有 API 保持不变(例如,System.Collections 命名空间中的代码)并引入了新的通用 API(例如,System.Collections.Generic 命名空间中的代码)。

那么,与 .NET 泛型不同,Java 泛型为何需要原始类型/类型擦除呢?

4

2 回答 2

8

.Net 通过更改字节码语言、虚拟机和 JITter 来识别泛型类型来引入泛型。
这是一项巨大的工作,大约需要两年时间。

Java 引入了泛型作为纯粹的编译时特性,只有很小的运行时更改(新的元数据和反射 API)。
这是一项简单得多的任务,它保持了与旧运行时的向后兼容性,但使用起来更烦人。

于 2013-07-12T13:41:52.027 回答
3

Sun 特别热衷于保证向后兼容性,因为它是 Java 软件的一个庞大的成熟基础。为此,他们认为 JVM 中的更改最少是最好的。事后看来,从长远来看,这似乎不是最好的决定,因为这意味着 JVM 并不真正理解泛型,也无法优化掉许多冗余的类检查。

相比之下,Oracle 不太愿意更改 JVM,并且遭受了更严重和公开的错误,尤其是。与安全有关。(它们的意思不同,但一个可以导致另一个)即便如此,Oracle 只在 JVM 中添加了一条指令,Java 甚至没有使用,而 Sun 没有添加,所以它确实是相对的。;)

另一方面,微软的 C# 代码库较小,客户更习惯于在主要版本之间进行重大甚至破坏性的更改。这意味着在短期内会有更多的痛苦,但从长远来看可能是更好的选择。由于历史原因留下的问题较少。

简而言之,差异不是技术性的,而是政治性和历史性的。

于 2013-07-12T13:54:42.853 回答