.NET中的泛型和Java泛型中的类型擦除-创新互联
开放类型和闭合类型
我们拥有10余年网页设计和网站建设经验,从网站策划到网站制作,我们的网页设计师为您提供的解决方案。为企业提供成都网站制作、网站建设、微信开发、小程序设计、成都做手机网站、H5场景定制、等业务。无论您有什么样的网站设计或者设计方案要求,我们都将富于创造性的提供专业设计服务并满足您的需求。.NET把带有类型参数的类型看做一个新的类型,CLR将为这些类型创建内部类型对象,带有类型参数的类型可以是类,结构,接口和委托。但是,一个带有类型参数的类型称为开放类型,CLR不允许开放类型实例化(就好比不允许接口实例化一样)。
当代码中引用了泛型类型,代码里可以指定一组泛型类型参数。如果传入实际的数据类型,那么这个类型就成为闭合类型,CLR允许实例化闭合类型。然而,也有可能代码引用了泛型类型,但未指定泛型类型参数,这就在CLR中创建了一个新的开放类型,这种类型无法实例化,看一个例子。
- internal sealed class
- staticvoid
- null
- // Dictionary<,> 有2个类型参数的开放类型
- typeof
- // 创建实例会失败
- // DictionaryStringKey<>有一个类型参数的开发类型
- typeof
- // 创建该类型的实例也会失败
- // DictionaryStringKey
是闭合类型 - typeof
- // 创建成功
- // 输出类型名字
- "Object type="
- privatestatic
- null
- try
- //使用默认的构造函数来创造该类型的实例
- "Created instance of {0}"
- catch
- return
运行结果:
Activator.CreateInstance创建实例的时候,会提示你该类型包含泛型参数。
输出中,可以看到类型名称后跟着反引号(`)以及一个数字。这个数字即类型中的类型参数的数量。比如泛型Dictionary类是2,因为它需要2个类型参数来指示TKey和TValue。DictionaryStringKey类只有1个因为它只需要指明1个类型TValue。
.NET中的类型
.net中,除了实例构造器,CLR也支持类型构造器(也称作静态够器,类够在其或者类型初始化器)。类型构造器可以应用于接口(c#中不支持),引用类型(class)和值类型(struct),和实例构造器初始化类型的实例一样,类型构造器用来初始化类型的一些状态,类型的构造器如果有的话 只可能有1个,并且是无参的。可以参考之前的文章。
http://cnn237111.blog.51cto.com/2359144/576533
由于CLR保证了类型初始化器只执行一次,并且是线程安全的,因此类型初始化器适用于用在单例模式中对单例对象的初始化。
类型中的静态字段可以认为是类型的一部分,而类型中的非静态字段可以认为是实例对象的一部分。当JIT编译器把IL语言转换成本地的CPU指令的时候,会遇到很多类型(比如自定义的class),CLR为了能正确的加载包含这些类型的程序集,它会通过程序集的元数据,抽取出类型的信息,然后创建这些类型的数据数据结构。这些数据结构作为对象存放在堆中。堆中所有的对象都有2个成员,类型对象指针和同步块索引。类型中定义的静态字段也包含在数据结构对象中。类的实例对象都共享类型对象中同一个静态字段。如下图:方框中的Manager是类型对象,静态字段存在于类型对象中。实例对象由椭圆框表示,指向类型对象。
对于.NET泛型来说,每一个闭合类型都有自己的静态字段。也就是说List<>和List
- staticvoidstring
- booltypeoftypeofstring
- objecttypeof
- typeofstring
运行结果如下:
Java泛型中的类型擦除
经常听人说起Java的泛型是伪泛型,因为在编译或运行期间,java的JIT会对进行类型擦除。即JVM无法真正识别出泛型类型,因此在真正运行前会把泛型类型转换成原始类型。因此,所有的泛型类型,本质上都共享同一个类型对象。比如List
- publicstaticvoidthrows
- new
- new
- boolean
- //true
- //java.util.ArrayList
- //java.util.ArrayList
也正是由于代码擦除,使得泛型类型本质上都是共享同一个类型对象,因此类型的静态字段也是共享的。例如下面代码:
- publicclass
- publicstaticint0
- public
- publicstaticvoidthrows
- new
- new
最终运行的结果是2.
参考文档:Microsoft.Press.CLR.via.Csharp.4th.Edition.Oct.2012.
https://en.wikipedia.org/wiki/Generics_in_Java.
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
网站标题:.NET中的泛型和Java泛型中的类型擦除-创新互联
标题URL:http://pwwzsj.com/article/gdsjd.html