关闭

.NET中的泛型和Java泛型中的类型擦除

发表于:2013-3-22 11:00

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:cnn237111    来源:51Testing软件测试网采编

  开放类型和闭合类型

  .NET把带有类型参数的类型看做一个新的类型,CLR将为这些类型创建内部类型对象,带有类型参数的类型可以是类,结构,接口和委托。但是,一个带有类型参数的类型称为开放类型,CLR不允许开放类型实例化(就好比不允许接口实例化一样)。

  当代码中引用了泛型类型,代码里可以指定一组泛型类型参数。如果传入实际的数据类型,那么这个类型就成为闭合类型,CLR允许实例化闭合类型。然而,也有可能代码引用了泛型类型,但未指定泛型类型参数,这就在CLR中创建了一个新的开放类型,这种类型无法实例化,看一个例子。

  1. internal sealed class DictionaryStringKey<TValue> :Dictionary<String, TValue> 
  2.         { 
  3.         } 
  4.         static void Main(string[] args) 
  5.         { 
  6.             Object o = null
  7.             // Dictionary<,> 有2个类型参数的开放类型 
  8.             Type t = typeof(Dictionary<,>); 
  9.             // 创建实例会失败 
  10.             o = CreateInstance(t); 
  11.             Console.WriteLine(); 
  12.             // DictionaryStringKey<>有一个类型参数的开发类型 
  13.             t = typeof(DictionaryStringKey<>); 
  14.             // 创建该类型的实例也会失败 
  15.             o = CreateInstance(t); 
  16.             Console.WriteLine(); 
  17.             // DictionaryStringKey<Guid> 是闭合类型 
  18.             t = typeof(DictionaryStringKey<Guid>); 
  19.             // 创建成功 
  20.             o = CreateInstance(t); 
  21.             // 输出类型名字 
  22.             Console.WriteLine("Object type=" + o.GetType()); 
  23.         } 
  24.         private static Object CreateInstance(Type t) 
  25.         { 
  26.             Object o = null
  27.             try 
  28.             { 
  29.                 //使用默认的构造函数来创造该类型的实例 
  30.                 o = Activator.CreateInstance(t); 
  31.                 Console.Write("Created instance of {0}", t.ToString()); 
  32.             } 
  33.             catch (ArgumentException e) 
  34.             { 
  35.                 Console.WriteLine(e.Message); 
  36.             } 
  37.             return o; 
  38.         }

  运行结果:

  Activator.CreateInstance创建实例的时候,会提示你该类型包含泛型参数。

  输出中,可以看到类型名称后跟着反引号(`)以及一个数字。这个数字即类型中的类型参数的数量。比如泛型Dictionary类是2,因为它需要2个类型参数来指示TKey和TValue。DictionaryStringKey类只有1个因为它只需要指明1个类型TValue。

  .NET中的类型

  .net中,除了实例构造器,CLR也支持类型构造器(也称作静态够器,类够在其或者类型初始化器)。类型构造器可以应用于接口(c#中不支持),引用类型(class)和值类型(struct),和实例构造器初始化类型的实例一样,类型构造器用来初始化类型的一些状态,类型的构造器如果有的话 只可能有1个,并且是无参的。

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号