为什么Java(但不是.NET)无法在不需要原始类型/类型擦除的情况下容纳泛型?

J S*_*ith 5 .net java generics type-erasure raw-types

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

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

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

SLa*_*aks 8

.Net通过更改字节码语言,虚拟机和JITter来识别泛型类型,从而引入了泛型.
这是一项花了大约两年时间的大量工作.

Java将泛型引入纯粹的编译时功能,只有很小的运行时更改(新的元数据和反射API).
这是一个更简单的任务,它保持向后兼容较旧的运行时,但使用起来更烦人.

  • 此外,.Net用不同命名空间中的通用版本替换现有容器.想要使用它们的代码必须同时移植.Java的方式允许他们简单地使现有容器通用,因此一点一点地移植意味着偶尔的施法和警告抑制. (3认同)