`
kulinglei
  • 浏览: 101422 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java和C#的泛型比较

阅读更多
C#的泛型:

C#泛型类在编译时,先生成中间代码IL,通用类型T只是一个占位符。在实例化类时,根据用户指定的数据类型代替T并由即时编译器(JIT)生成本地代码,这个本地代码中已经使用了实际的数据类型,等同于用实际类型写的类,所以不同的封闭类的本地代码是不一样的。按照这个原理,我们可以这样认为:

泛型类的不同的封闭类是分别不同的数据类型。


java的泛型

对java虚拟机来说是没有泛型类的。java编译器在编译泛型类是会用泛型类的左边第一个限定类去替换。eg: ArrayList<T extend a & b>
编译后ArrayList的所以T会被a 去替换。但put数据是。编译器会检查put的数据是不是a类型的。但get数据时。他会返回a类型的数据.并添加类型转换代码。(这样效率就低了)
eg: ArrayList<News> arrayList=new ...; arrayList.get(0);
编译器会返回 a类型的数据。然后把 数据转换成News数据。
总之java没有泛型类。在编译后都是基本的类型。并加类类型转换。


这是我的看法。希望有人交流交流
分享到:
评论
73 楼 bsq519 2009-04-04  
我对泛型,也不是很了解。但是我觉得用泛型。可以提高考发效率。方便我们的开发!!
72 楼 量产型人型自走炮 2009-04-03  
写道

而引用类型的引用在运行时就变回裸指针

恩,对 我忘了.net的引用类型实际只是指针。
那我YY一下
1.以add方法为例,是不是能否共享的因素只是需要压栈的实参长度,而跟具体类型无关?
2.假设1成立,且允许在栈上分配数组,并且允许数组作为值而不是指针传递。
  我泛型的类型实际是一个符合以上条件的数组,那么是不是数组的长度必须是一致的才能作为同一类型..就像C里面指向 数组的指针(如int (*ptr)[10]或者作为形参的时候写成int prt[][10])其中每个数组的长度必须是一致的。

71 楼 RednaxelaFX 2009-04-03  
量产型人型自走炮 写道
我以为这贴主要是讨论泛型实现来着..不过想想协变的概念跟JIT以后的nativecode共享也是一样的吧
类型作为参数的可以逆协变共享,返回值为类型的可以正协变共享。类型无关的双向共享。

楼主也没限定说是实现问题嘛,不是交流交流么ww
CLR从2.0开始就已经支持协变和逆协变了,直接写MSIL的话类型参数写成+T表示协变,-T表示逆协变。但C#在2.0和3.0均没有暴露这个功能,因为他们想“do it right”。结果C# 4.0的设计是只允许在接口类型上允许声明协变与逆协变,由泛型类型所在位置决定协变条件:如果在某个泛型接口中,T只出现在参数上而不出现在返回值上,则可用out T声明协变;如果T只出现在返回值上而不出现在参数上,则可用in T声明逆协变;如果T既出现在参数上也出现在返回值上(不一定要在同一个方法出现),则T不能声明为协变或逆协变的。
在执行的时候其实协变与否没有多少影响,过了IL verifier之后这些信息就没有特别大的意义了。由于.NET的值类型是不能被继承的,所以实质上没有协变不协变的问题。参与协变的泛型参数肯定是引用类型,而引用类型的引用在运行时就变回裸指针,类型之间没有明显的差异了。
(把“引用”加黑是免得后面有人没读仔细以为我说引用类型的值在类型间没差异……我可没这么说哦)

C#的协变性只能在泛型接口类型声明的地方声明,而Java的协变性则可以任意泛型类型的声明和使用的地方声明。像是Comparator<? extends MyClass> c = getComparator();。
70 楼 量产型人型自走炮 2009-04-03  
RednaxelaFX 写道
量产型人型自走炮 写道
钉宫病飘过(不过黑化钉宫砍了包子娘TAT)...协变嘛...偏题了吧

但包子娘的人气不高吧?至少在我认识的人里她人气不咋……

协变哪里偏题了嘛,你看到C# 4.0之前C#的泛型都不是协变/逆协变的,而Java泛型则从出现就一直支持这两个功能。也是值得对比的地方哦~


我以为这贴主要是讨论泛型实现来着..不过想想协变的概念跟JIT以后的nativecode共享也是一样的吧
类型作为参数的可以逆协变共享,返回值为类型的可以正协变共享。类型无关的双向共享。
69 楼 RednaxelaFX 2009-04-03  
量产型人型自走炮 写道
钉宫病飘过(不过黑化钉宫砍了包子娘TAT)...协变嘛...偏题了吧

但包子娘的人气不高吧?至少在我认识的人里她人气不咋……

协变哪里偏题了嘛,你看到C# 4.0之前C#的泛型都不是协变/逆协变的,而Java泛型则从出现就一直支持这两个功能。也是值得对比的地方哦~
68 楼 量产型人型自走炮 2009-04-02  
RednaxelaFX 写道
xiaoyu 写道
头像呀, 你也喜欢皇? 我的最爱呀。 高达00 握手。

握手。皇小姐美甚。粉红也美甚。
(well还是不要在这帖灌水了……)

其实说到Java与C#的泛型比较,这帖里还没人提到协变和逆协变呢。虽然其实已经有协变的代码出现过……


钉宫病飘过(不过黑化钉宫砍了包子娘TAT)...协变嘛...偏题了吧
67 楼 RednaxelaFX 2009-04-02  
xiaoyu 写道
头像呀, 你也喜欢皇? 我的最爱呀。 高达00 握手。

握手。皇小姐美甚。粉红也美甚。
(well还是不要在这帖灌水了……)

其实说到Java与C#的泛型比较,这帖里还没人提到协变和逆协变呢。虽然其实已经有协变的代码出现过……
66 楼 xiaoyu 2009-04-02  
RednaxelaFX 写道
用于生成源码的模板的话,String Template如何?ANTLR也是用它来作为后端来生成源码的,可以说品质有保证。


头像呀, 你也喜欢皇? 我的最爱呀。 高达00 握手。
65 楼 RednaxelaFX 2009-04-02  
Miguel说Mono不会主动去实现WPF,除非有贡献者特别有爱自告奋勇去实现出来。但他同时也对Silverlight非常感兴趣,很热衷将Moonlight搞好。他有些有趣的打算,想将Moonlight带到桌面,甚至通过完全AOT模式编译来将Moonlight带到iPhone上(因为iPhone不允许第三方程序使用动态编译,所以要在iPhone上部署Mono就必须采用AOT而不能用JIT)。如果能成功实现Silverlight 2或3的进度,Moonlight倒像是个小型WPF了。

前面提到Mono的trunk里已经有CoreCLR中的安全机制的实现,也巧,.NET这边也在反思到底CAS是不是一个好的设计;在MIX09的CoreCLR session里,Brandon说.NET 4里的新CLR会考虑学习CoreCLR得到的经验,使用简化的安全模型。
64 楼 mathgl 2009-04-02  
RednaxelaFX 写道
.NET从2.0开始有很长一段时间没有动过下面的虚拟机CLR,一直到3.5SP1的时候才顺带发布了2.0SP2,其中带有CLR的更新;但是MSIL指令集从.NET 2.0开始就没变过了。
这对Mono来说是件好事,因为在虚拟机层上他们可以集中精力去实现一个固定的标准,投入精力去满足标准和提高性能。虽然现在Mono还比CLR慢,不过速度提升的势头还是很不错的。
Mono目前没有实现CAS,只在当前的trunk里实现了CoreCLR的安全模型,包括沙箱、IL验证器之类。要等到Mono 2.6才会把这个安全模型正式发布出来。
Mono项目中的C#编译器已经基本实现了C# 3.0的支持,可以编译LINQ代码。VB编译器则支持到VB.NET 8。

Mono的类库有自己的特色。标准库方面,核心库实现得已经很多了;WinForms相关的API基本实现到了2.0水平,虽说实际用还是可能会碰到小问题;LINQ to Db的整合会在Mono 2.6实现;WCF和WPF没有实现的计划。在标准库之外,Mono还有许多自己的有趣的库,包括Gtk#、Mono.Options、CSharpEvaluator等。MonoDevelop的GUI就是基于Gtk#来做的,现在看来还不错。

我还没部署过XSP所以不太清楚对ASP.NET的支持到什么程度了,貌似……还成?



asp.net支持不错。 www.mononet.cn就是一个例子。
wpf,wcf看起来mono不会支持。现在winforms的bug还很多,能解决大部分就不错了。

说实在cross-platform大部分都有各种各样的问题,不像说得那么好。
63 楼 ray_linn 2009-04-01  
RednaxelaFX 写道
.NET从2.0开始有很长一段时间没有动过下面的虚拟机CLR,一直到3.5SP1的时候才顺带发布了2.0SP2,其中带有CLR的更新;但是MSIL指令集从.NET 2.0开始就没变过了。
这对Mono来说是件好事,因为在虚拟机层上他们可以集中精力去实现一个固定的标准,投入精力去满足标准和提高性能。虽然现在Mono还比CLR慢,不过速度提升的势头还是很不错的。
Mono目前没有实现CAS,只在当前的trunk里实现了CoreCLR的安全模型,包括沙箱、IL验证器之类。要等到Mono 2.6才会把这个安全模型正式发布出来。
Mono项目中的C#编译器已经基本实现了C# 3.0的支持,可以编译LINQ代码。VB编译器则支持到VB.NET 8。

Mono的类库有自己的特色。标准库方面,核心库实现得已经很多了;WinForms相关的API基本实现到了2.0水平,虽说实际用还是可能会碰到小问题;LINQ to Db的整合会在Mono 2.6实现;WCF和WPF没有实现的计划。在标准库之外,Mono还有许多自己的有趣的库,包括Mono.Options、CSharpEvaluator等。

我还没部署过XSP所以不太清楚对ASP.NET的支持到什么程度了,貌似……还成?


里面的net api库相当不错,比如flickr的
62 楼 RednaxelaFX 2009-04-01  
.NET从2.0开始有很长一段时间没有动过下面的虚拟机CLR,一直到3.5SP1的时候才顺带发布了2.0SP2,其中带有CLR的更新;但是MSIL指令集从.NET 2.0开始就没变过了。
这对Mono来说是件好事,因为在虚拟机层上他们可以集中精力去实现一个固定的标准,投入精力去满足标准和提高性能。虽然现在Mono还比CLR慢,不过速度提升的势头还是很不错的。
Mono目前没有实现CAS,只在当前的trunk里实现了CoreCLR的安全模型,包括沙箱、IL验证器之类。要等到Mono 2.6才会把这个安全模型正式发布出来。
Mono项目中的C#编译器已经基本实现了C# 3.0的支持,可以编译LINQ代码。VB编译器则支持到VB.NET 8。

Mono的类库有自己的特色。标准库方面,核心库实现得已经很多了;WinForms相关的API基本实现到了2.0水平,虽说实际用还是可能会碰到小问题;LINQ to Db的整合会在Mono 2.6实现;WCF和WPF没有实现的计划。在标准库之外,Mono还有许多自己的有趣的库,包括Gtk#、Mono.Options、CSharpEvaluator等。MonoDevelop的GUI就是基于Gtk#来做的,现在看来还不错。

我还没部署过XSP所以不太清楚对ASP.NET的支持到什么程度了,貌似……还成?
61 楼 ray_linn 2009-04-01  
imjl 写道
RednaxelaFX 写道
ray_linn 写道
mooniscrazy 写道
泛型也就那么回事吧。写代码方便而已。

写代码方便? 你再开玩笑吧?有了泛型写代码还的多打好几个字<...>呢,如果你这样看泛型,那你就根本没学好泛型

呵呵,说写代码方便也可以,典型的场景是声明了泛型容器之后,从容器取出元素的时候不必显式写类型转换。不过要注意的是Java泛型是擦除法,自己的代码里不写类型转换不代表没转换——编译器会插入相关的类型转换代码,来保证运行时的类型安全。
不过泛型确实不只是“写代码方便”那么简单就是了,呵呵。有没有人想过在.NET里用了泛型之后方法调用反而可能变慢?呵呵,要是一直有在用Mono的话就会知道我在说什么。


Mono现在怎么样?



已经算是比较stable,实现了.net 2.0了吧
60 楼 imjl 2009-04-01  
RednaxelaFX 写道
ray_linn 写道
mooniscrazy 写道
泛型也就那么回事吧。写代码方便而已。

写代码方便? 你再开玩笑吧?有了泛型写代码还的多打好几个字<...>呢,如果你这样看泛型,那你就根本没学好泛型

呵呵,说写代码方便也可以,典型的场景是声明了泛型容器之后,从容器取出元素的时候不必显式写类型转换。不过要注意的是Java泛型是擦除法,自己的代码里不写类型转换不代表没转换——编译器会插入相关的类型转换代码,来保证运行时的类型安全。
不过泛型确实不只是“写代码方便”那么简单就是了,呵呵。有没有人想过在.NET里用了泛型之后方法调用反而可能变慢?呵呵,要是一直有在用Mono的话就会知道我在说什么。


Mono现在怎么样?
59 楼 RednaxelaFX 2009-04-01  
ray_linn 写道
RednaxelaFX 写道
用于生成源码的模板的话,String Template如何?ANTLR也是用它来作为后端来生成源码的,可以说品质有保证。

配合VS sdk来插入DBC的代码,应该是个很好的方法。

说来VS2008里不是带了T4么,那个据说也很流行。MonoDevelop也实现了T4,如果不好用的话相信他们不会浪费时间去实现这样一个模板引擎的。

说到VS SDK……呜,之前写我自己的语言插件的时候被VS SDK折腾死了。我自己的parser要接上去太麻烦了,写的adapter的代码量比用Managed Babel重新写个parser还大。指望VS2010新的插件模型能爽一点。
58 楼 ray_linn 2009-04-01  
RednaxelaFX 写道
用于生成源码的模板的话,String Template如何?ANTLR也是用它来作为后端来生成源码的,可以说品质有保证。


配合VS sdk来插入DBC的代码,应该是个很好的方法。
57 楼 RednaxelaFX 2009-04-01  
用于生成源码的模板的话,String Template如何?ANTLR也是用它来作为后端来生成源码的,可以说品质有保证。
56 楼 ray_linn 2009-04-01  
RednaxelaFX 写道
ray_linn 写道
非常类似,CodeDom的目的也就是产生代码。我觉得mokey patch这段非常形象的说明了how to 动态产生一些代码执行之。其实两条路:

1. 要嘛弄出source code, codedom, 模板,文本定义都是可以的。

2. 要嘛就在il层搬弄,emit或者cecil。


第一种方法的难度明显要小多了。

既然提到CodeDom,我是想推荐用DLR tree(或者叫Expression Tree v2)作为CodeDom的替代品,在表达式层次上比CodeDom全面得多,而且以后也会更通用

(完了,才留意到我们已经完全跑题,拿人家的帖来版聊别的内容了 XDD)



CodeDom其实是特别麻烦的事情,我在想用veolcity如何?template ..


以前还实现过一个比较奇怪的东西,一堆方法,方法名和il op code是一样的,写起来就感觉类似插入il code,
55 楼 RednaxelaFX 2009-04-01  
ray_linn 写道
非常类似,CodeDom的目的也就是产生代码。我觉得mokey patch这段非常形象的说明了how to 动态产生一些代码执行之。其实两条路:

1. 要嘛弄出source code, codedom, 模板,文本定义都是可以的。

2. 要嘛就在il层搬弄,emit或者cecil。


第一种方法的难度明显要小多了。

既然提到CodeDom,我是想推荐用DLR tree(或者叫Expression Tree v2)作为CodeDom的替代品,在表达式层次上比CodeDom全面得多,而且以后也会更通用

(完了,才留意到我们已经完全跑题,拿人家的帖来版聊别的内容了 XDD)
54 楼 ray_linn 2009-04-01  
RednaxelaFX 写道
ray_linn 写道
量产型人型自走炮 写道
另外问个不相关的,JS.NET的eval函数是如何实现的?在字节码级别上。
可以参考ironruby。无非是用CodeDom生成class并compiler之

ray_linn 写道
呵呵,我说的是Monkey Patching,刚才就记得Monkey什么东西,因为在wow打怪带着个猩猩,所以想这是Monkey Jumping ...

上山者一名发现……
嘛,monkey patch与否,JScript.NET和IronRuby都没用到CodeDom就是了……|||
IronRuby的eval实现可以在这里看到,从#region Evals那行开始。



Monkey Patch不是实现eval,是实现method missing的,与eval的区别,其实只是方法,或者方法体的区别。

eval的内容你可以看成是一个方法体,method missing,则是一个方法。

我觉得mokey patch这段非常形象的说明了how to 动态产生一些代码执行之。其实两条路:

1. 要嘛弄出source code, codedom, 模板,文本定义都是可以的。

2. 要嘛就在il层搬弄,emit或者cecil。


第一种方法的难度明显要小多了。

相关推荐

    关于C#、java泛型的看法

    在编程世界中,C#和Java都是广泛应用的高级编程语言,它们都支持泛型这一强大的特性,以提高代码的类型安全性和重用性。本文将深入探讨C#和Java在泛型实现上的异同,帮助开发者更好地理解和利用这两种语言的泛型功能...

    C#泛型专题

    例如,Java 提供了 `extends` 和 `super` 关键字来限定泛型参数的上下界,这是 C# 和 C++ 模板所不具备的功能。 - **示例:**文中提到了一个具体的例子,展示了如何在 Java 中利用 `? extends A` 来解决不同类型的...

    Java C# 语法 比较

    以下是对Java和C#之间语法规范的详细比较: 1. 编译及启动程序 - Java使用`javac`进行编译,C#使用`csc`。 - 两者的开发工具都支持NppExec插件来执行命令行编译。 - Java的类路径使用`-cp`或`-classpath`参数...

    Generic Programming for Scientific Computing in C++, Java, and C#

    这种设计使得C#泛型在处理数值计算时更为灵活和高效。 #### 结论 通过对C++、Java和C#中泛型机制的深入研究与比较,可以看出这三种语言各自的优势和局限性。对于科学计算领域来说,C#的泛型机制因为支持值类型作为...

    泛型反射例子

    JAVA中 关于泛型 以及反射的例子 欢迎下载 一起研究

    C# To JAVA Converter v17.10.6

    使用Java泛型转换C#ref参数 当代码中定义事件委托时转换C#事件,或者是System.Action或System.Func代理之一 将所有类型的数组从C#转换成Java 对于继承和接口的所有方面,从C#到Java的无瑕疵转换 允许自定义替换...

    Java泛型类型擦除后的补偿

    然而,Java的泛型并非像C++或C#那样在运行时存在,而是在编译期间经历一个称为“类型擦除”的过程。这个过程会将泛型信息消除,代之以相应的原始类型,以确保与Java早期版本的兼容性。本文将深入探讨Java泛型类型...

    java代码转c#

    Java 和 C# 都是流行的面向对象编程语言,它们在语法和某些概念上有许多相似之处,但也存在一些差异。在编程领域,有时需要将已有的 Java 代码转换为 C#,以便在 .NET 平台上运行或利用 C# 的特定功能。这个过程通常...

    C# To JAVA Converter v17.10.6(最新破解版)

    2. 泛型:C#的泛型比Java更灵活,Java中的泛型是类型擦除的,转换时需要考虑类型安全性和代码效率。 3. 枚举与常量:C#的枚举是类型安全的,Java则通过类或接口实现,转换时需调整代码结构。 4. 异常处理:C#的...

    快速了解泛型(C#,JAVA,C++)

    总结起来,泛型在C#、Java和C++中都扮演着重要的角色,提供了一种方式来编写通用代码,同时保持类型安全。理解并熟练运用泛型,能帮助开发者编写出更高效、更健壮的软件系统。而Anders Hejlsberg,作为C#的首席架构...

    JAVA与C#面试题及答案

    在IT行业中,Java和C#是两种非常重要的编程语言,广泛应用于企业级应用开发、游戏开发、移动应用等领域。这份“JAVA与C#面试题及答案”资源包含了这两个语言的关键知识点,是准备面试或者自我提升的宝贵资料。下面,...

    java与C#的区别

    Java和C#是两种广泛应用的面向对象编程语言,它们在设计目标、语法、运行环境、内存管理和多线程等方面有着显著的区别。以下是这两者之间的一些关键对比: 1. **设计目标**: - Java最初由Sun Microsystems开发,...

    解析Java泛型的类型擦除.pdf

    Java 泛型是 Java SE 1.5 的新特性,它们在语法和应用环境上与 C++ 中的模板相似,但是本质上它们之间有着区别,这种区别就在于 Java 泛型的类型擦除。 Java 泛型的类型擦除是 Java 语言中的一种机制,它使得泛型...

    Webservice传递泛型的案例,包括web服务端和mobile端

    1. 泛型的概念和C#中的泛型使用。 2. Web服务(ASMX或WCF)的基本原理和泛型对象的序列化与反序列化。 3. 移动端如何与Web服务通信,包括泛型对象的序列化和反序列化。 4. 在实际应用中,如何在Web服务端创建接受和...

    学习上的一些小结,主要是java和C#等

    在IT领域,Java和C#是两种非常重要的编程语言,广泛应用于软件开发、Web应用程序以及移动应用开发。本文将深入探讨这两个语言的核心概念,以及它们在实际开发中的应用,同时也会涉及Spring框架,一个在Java生态系统...

    c# java互相转换工具

    6. 泛型:C#和Java的泛型语法和用法有细微差别,转换时需要注意类型约束和通配符的区别。 7. 并发处理:C#的`Task`和`async/await`与Java的`Future`和`ExecutorService`在处理并发上有不同的方式。转换时要理解各自...

    java、c#面向对象OOP

    Java和C#是两种广泛应用的面向对象编程语言,它们在设计上都充分体现了OOP的思想。 1. **类与对象**:在OOP中,类是对象的模板或蓝图,定义了一组属性(数据成员)和方法(成员函数)。对象是类的实例,拥有类定义...

Global site tag (gtag.js) - Google Analytics