`
kulinglei
  • 浏览: 99034 次
  • 性别: 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泛型的看法

    谈谈关于Microsoft Visual Studio 2008中C#和java泛型的区别

    泛型反射例子

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

    C# To JAVA Converter v17.10.6

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

    你真的懂Java泛型吗?

    在JDK 1.5开始引入了泛型,但Java实现泛型的方式与C++或C#差异很大。在平常写代码用到泛型时,仿佛一切都来得如此理所当然。但其实Java泛型还是有挺多tricky的东西的,编译器在背后为我们做了很多事。下面我们来看看...

    c# 反射获取传入对象的属性拼接sql语句实现增、删、改、查

    利用反射动态拼接sql。 daohelper属于DAL层,objectdata类属于BLL层,BLL层引用DAL层。映射数据的表继承objectdata类。例如,数据表book,根据字段与属性一一对应的方式创建book类,插入数据库时,直接book.save()

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

    泛型其实就是能够向你的类型中加入类型参数的一种能力,也称作参数化的类型或参数多态性

    开发专家·编程大讲坛:C#核心开发技术从入门到精通.tag.pdf

    依次讲解了C#开发基础、搭建C#开发环境、变量与常量、复杂的变量类型和.NET框架类、表达式和运算符、流程控制...和事件、C#泛型、C#文件操作和流文件操作、XML文件操作处理、C#的Windows编程基础、菜单、工具栏和对话框...

    Silverlight与Java通信远程调用封装

    可以转换日常使用中的任意复杂类型通信,成功解决C# DateTime和Java Date传递问题,解决java容器泛型与C#容器泛型转换问题,解决复杂对象问题(对象属性是另外对象,容器中套容器)等。 欢迎大家使用,有问题,可以...

    c#分页方案

    提供三种.net分页方案,总结既详细又简单实用

    Java泛型类型通配符和C#对比分析

    下面小编就为大家带来一篇Java泛型类型通配符和C#对比分析。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    泛型约束,.NET 中越来越多的使用到泛型

    泛型,无论在Java中还是在C#中,应用都很广泛,可以解决很多关于类型的问题

    自定义的Troop&lt;T&gt;泛型类( c++, java和c#)的实现代码

    主要介绍了自定义的Troop泛型类( c++, java和c#)的实现代码的相关资料,需要的朋友可以参考下

    java笔试题算法-C5:用于C#/.NET的C5泛型集合库

    编程语言和其他支持泛型的语言的一组泛型集合类(或容器类),由 Microsoft .NET 4.6.1+、.NET Core 2.0+ 实现,和单声道。 C5 库提供了广泛的经典数据结构、丰富的功能、最佳的渐近时间复杂度、记录的性能和经过...

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

    JavaTM and C# programming languages. In this paper, we evaluate these extensions with respect to the realm of scientific computing and compare them with C++ templates. At the heart of our comparison ...

    Apla→Java程序生成系统中泛型机制实现方法研究.pdf

    在对泛型程设本质特征深入研究的基础上提出了新型泛型语言机制构想,并在Apla→java生成系统...该方法比现有的java、C++、C#等语言中泛型机制的实现方法简单,并通过经典算法实例演示实现效果,大量用例的成功测试表明...

    关于C#编程语言的一些常见基础面试题.pdf

    2. C#与其他编程语言(如Java、C++等)有哪些不同之处?请说明C#相对于其他语言的优势。 3. C#中的命名空间(Namespace)是什么?请说明在C#中命名空间的作用和用法。 4. C#语言中的面向对象编程(Object-Oriented ...

    C#中数组Array,ArrayList,泛型List详细对比

    关于数组Array,ArrayList,泛型List,简单的说数组就是值对象,它存储数据元素类型的值的一系列位置.Arraylist和list可以提供添加,删除,等操作的数据. 具体如何进行选择使用呢,我们来详细探讨下

    C#实现利用泛型将DataSet转为Model的方法

    因为网站需要用C#开发,习惯了java的泛型,所以看了一下C#下,也可以这样做,随便写了一个。 public static List&lt;T&gt; PutAllVal(T entity, DataSet ds) where T : new() { List&lt;T&gt; lists = new List(); if (ds....

    c# 5.0 解析

    C#3 0加入了一堆语法糖 lambda linq的加入 让C#变得更加优雅和灵活; C#4 0增加了动态语言的特性 另外加入的TPL 并行开发库 PLinq等降低现存并发模型的复杂性也是相当的给力 C#5 0 还会有什么奇思妙想 "&gt;C# 5 0 not...

    java数据库增删改查操作实例(hibernate原理)支持泛型集合

    写了一个通用java访问数据库操作的DAO类,非常简单,非常强大,非常方便,非常好用。绝对原版,绝对原创。把hibernate彻底扔掉。(根据C#改编的,原本我是搞C#开发的)支持泛型集合,让程序运行效率更高。

Global site tag (gtag.js) - Google Analytics