当前位置:首页 > 开发 > 编程语言 > C# > 正文

Generice Java (and c#)

发表于: 2006-08-23   作者:buaawhl   来源:转载   浏览:
摘要: 人心思动的年代,还有人学习静态范型(static generic type),令人欣慰。 网上流传的Java范型学习资料,基本上都是些入门用法的知识。 我在这里试图解释一下原理。 Java Generic 采用的实现方案是Type Erasure; C# Generic采用的实现方案是Reification。 Java Generic -- Type Erasure Jav
人心思动的年代,还有人学习静态范型(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的原理。强烈推荐。

Generice Java (and c#)

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号