人心思动的年代,还有人学习静态范型(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的原理。强烈推荐。
网上流传的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的原理。强烈推荐。