Java泛型 - 全面的“从头到尾”指南?

时间:2011-04-19 03:41:17

标签: java generics runtime compile-time

我已经阅读了很多关于java中的通用概念。我已经有了一些疑问,已经通过 StackOverflow 的精确答案得到了解答。

我不认为此前已经提出过这个问题 我搜索了很多。 但是,我无处可回答这个问题,

  

所有事情发生的方式和方式   通用程序(在java中)在                (a)编制时间
               (b)运行时执行。

     

喜欢......
    步骤明智的是什么?     编译器存储泛型的位置   信息等...

任何人都可以用示例代码向我解释一下吗?

感谢。

编辑:我知道类型擦除的一些概念,删除了所有通用信息,但我不知道通用程序的所有步骤。

2 个答案:

答案 0 :(得分:4)

阅读Angelika Langer FAQ About Generics,您很可能会在那里找到所有问题的答案。

这本书The Java Programming Language 4th Edition包含了关于这个主题的好章节。

当然,没有比你可以免费获得的Java Language Specification更好的参考。

如果你真的打算那么深入,那本书Java Generics and Collections也是一本关于这个主题的非常好的书。我发现了这本书here的PDF版本。不幸的是它只包含几页。

答案 1 :(得分:0)

如果你使用.Net和Java,那么http://jorudolph.wordpress.com/2010/04/21/net-generics-implementation/提供了一个比较&对比观点。

http://www.codeproject.com/KB/java/GenericsInJavaPartII.aspx是示例代码的解释,显示了实现的含义。

简要说明......

A部分:

编译器清除(“擦除”)通用位(因此ArrayList变为ArrayList)。然后,当一个对象被拉出集合(例如,al.get(0))时,编译器会插入转换数据类型的代码(又名“装箱”)(将al.get(0)转换为(StackExchange)) al.get(0))。

B部分:

没有B部分。:)

Z部分:

Java中的泛型是在语言首次发布后大约十年实现的。因此,可能以向后兼容的名义,Java中的泛型仅作为语法糖。语法糖是一种奇特的方式,可以说“你可以自己编写这段代码,但编译器允许你输入一个快捷方式。”例如,在泛型出现在Java之前,您可以编写(StackExchange)al.get(0)。如果您使用泛型,编译器只会为您插入代码。