Generice Java (and c#)

人心思动的年代,还有人学习静态范型(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的原理。强烈推荐。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值