当前位置:首页 > 开发 > 编程语言 > 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

    震惊

    震惊

编辑推荐
来自:网络 c#与java的区别: C#基础--访问控制修饰符 访问控制修饰符包括:defaule,public,private,in
Java无法直接调用C# dll,需要通过经过桥接的方式,进行中继转发一下请求。查阅大量资料,做了大量
互操作性是Web Service的真正优势,虽然关于WS标准有很多,但不同厂家都是自己的实现,不同实现之间的
我们建立的开发网站kalistick算是个Java专营店了,从一开始的第一版起,全部产品使用的都是Java代码
这是一个普遍的问题,本身md5在实现的时候方式就很多,结果还不一致,更别谈跨语言了,今天把两种各
1.C#写com组件 开发环境 vs2005 1.新建工程:ClassLibrary1 2.右键点击工程->应用程序->程序集
通过COM组件方式实现java调用C#写的DLL文件 最近一段时间单位在做一个Web项目,工程师用JAVA语言,
In Between the Curly Braces After Java and C# - what is next? by Klaus Kreft and Angelika Lan
Ribbon 原来出现在 Microsoft Office 2007 的 Word、Excel 和 Powerpoint 組件中,后来也被运用到 W
刚刚看完java视频,做了个简单图: 新知识不多,大多是与以往知识的相互碰撞,一下做了java与C#的简
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号