我的理解是C#和java在某些方面在泛型方面有所不同,其中之一是泛型类型参数在运行时在C#/ .NET中可用,但在Java中不可用。为什么Java语言设计者会这样做?
答案 0 :(得分:9)
允许与pre-generics字节码二进制兼容,因此允许新代码与旧代码接口。
来自The Java Tutorials的Type Erasure页面:
Type erasure支持Java应用程序 使用泛型来维护二进制文件 兼容Java库和 之前创建的应用程序 泛型。
[...]
存在类型擦除以便新代码 可能继续与遗产接口 代码。
有关相关问题,请查看C# vs Java generics。
答案 1 :(得分:4)
我记得在Hardcore Java这本书中读到了一些内容:
然而,“为什么”这些问题永远无法得到满意的回答,因为涉及人,时间,地点和政治的变量太多了。我记得在其他地方读过这个决定与保持与Java字节代码中已经完成的事情的兼容性有很大关系。这是同一本书的另一个引用:检查元素的问题 运行时的集合就是它 非常昂贵;的顺序 效率仅为O(n)。如果你有 您的收藏中只有10个地址, 检查元素很容易。但是,如果 该系列包含15,000个 地址,然后你会招致一个 无论什么时候有人在 打电话给二传手。
另一方面,如果 你可以阻止用户放置 除了你的地址以外的任何地方 在编译时收集,然后你 不必检查类型 运行。如果他们试图给你 那些不是地址的东西 编译器将拒绝该尝试。 这正是参数化的内容 类型。
编译器解决了泛型引入的类型安全性后,它会从类型中删除参数化。因此,该信息在运行时不可用。如Sun所述,擦除的目的是允许使用旧版JDK构建的类库能够在JDK 1.5虚拟机上运行。
我很好奇,运行时泛型提供了哪些优势?