浏览 2965 次
|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
时间:2006-08-23 关键字: generic java
人心思动的年代,还有人学习静态范型(static generic type),令人欣慰。
网上流传的Java范型学习资料,基本上都是些入门用法的知识。 我在这里试图解释一下原理。 Java Generic 采用的实现方案是Type Erasure; C# Generic采用的实现方案是Reification。 Java Generic -- Type Erasure Java Generic的目的是编译期类型检查。 编译结果里面不保留具体generic type信息,运行期不进行generic type检查,也无法用Reflection获取generic type信息。 支持wildcard -- List<?>, List<? extends Number>, List<? super Integer> Java 的generic type信息只能够存在于Class定义中,而不是instance中。 所以,java只能支持Field, Method的generic type信息,这些信息存放在class文件的contant pool中,作为字符串常量出现,标志是signature. Field, Method的Reflection API可以获取Class定义中声明的generic type. class A { List<String> a; void sort(List<String> a); <T> void process(List<T> a); } List<String> List<T> 这些信息都存放在class文件的Constant Pool的字符串常量signature中。 对于method内部的局部变量。就没有办法了。 void a(){ List<String> list; } C# Generic -- Reification C# Generic的编译结果保留了generic type信息,从而可以运行时generic type检查,Reflection可以获取instance的generic type信息。 不支持wildcard。 generic type信息存放在每个Instance中。所以,有java fans说这种方式浪费内存。 ----------------------- 关于wildcard ? 的重要性。 http://mbravenboer.blogspot.com/2005/04/generics-importance-of-wildcards.html ----------------------- java generic type erasure的原理解释 http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html 非常全面。深入浅出地讲解了Compilier实现Type Erasure的原理。强烈推荐。 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2006-08-23
兄弟,辛苦了!来,做下来
这杯喝了还有 |
|
| 返回顶楼 | |
|
时间:2006-09-14
推荐一篇paper,比较了多个语言的泛型设计
http://www.osl.iu.edu/publications/prints/2003/comparing_generic_programming03.pdf |
|
| 返回顶楼 | |







