为什么Java泛型类型参数在运行时没有实现?

时间:2008-12-17 01:06:21

标签: java generics

我的理解是C#和java在某些方面在泛型方面有所不同,其中之一是泛型类型参数在运行时在C#/ .NET中可用,但在Java中不可用。为什么Java语言设计者会这样做?

2 个答案:

答案 0 :(得分:9)

允许与pre-generics字节码二进制兼容,因此允许新代码与旧代码接口。

来自The Java Tutorials的Type Erasure页面:

  

Type erasure支持Java应用程序   使用泛型来维护二进制文件   兼容Java库和   之前创建的应用程序   泛型。

     

[...]

     

存在类型擦除以便新代码   可能继续与遗产接口   代码。

有关相关问题,请查看C# vs Java generics

答案 1 :(得分:4)

我记得在Hardcore Java这本书中读到了一些内容:

  

检查元素的问题   运行时的集合就是它   非常昂贵;的顺序   效率仅为O(n)。如果你有   您的收藏中只有10个地址,   检查元素很容易。但是,如果   该系列包含15,000个   地址,然后你会招致一个   无论什么时候有人在   打电话给二传手。

     

另一方面,如果   你可以阻止用户放置   除了你的地址以外的任何地方   在编译时收集,然后你   不必检查类型   运行。如果他们试图给你   那些不是地址的东西   编译器将拒绝该尝试。   这正是参数化的内容   类型。

然而,“为什么”这些问题永远无法得到满意的回答,因为涉及人,时间,地点和政治的变量太多了。我记得在其他地方读过这个决定与保持与Java字节代码中已经完成的事情的兼容性有很大关系。这是同一本书的另一个引用:

  

编译器解决了泛型引入的类型安全性后,它会从类型中删除参数化。因此,该信息在运行时不可用。如Sun所述,擦除的目的是允许使用旧版JDK构建的类库能够在JDK 1.5虚拟机上运行。

我很好奇,运行时泛型提供了哪些优势?