王朝百科
分享
 
 
 

泛型类

王朝百科·作者佚名  2010-05-27  
宽屏版  字体: |||超大  

什么是泛型,如何使用和定义泛型?

泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。泛型集合类可以将类型参数用作它所存储的对象的类型的占位符;类型参数作为其字段的类型和其方法的参数类型出现。泛型方法可以将其类型参数用作其返回值的类型或者其形参的类型之一。下面的代码阐释一个简单的泛型类定义。

Visual Basic 代码

Public Class Generic(Of T)

Public Field As T

End Class

C# 代码

public class Generic<T>

{

public T Field;

}

C++ 代码

generic<typename T> public ref class Generic

{

public:

T Field;

};

在创建泛型类的实例时,会指定实际类型来替换类型参数。这会建立一个新的泛型类,称为构造泛型类,选定的类型将替换所有出现的类型参数。最后得到按照您选择的类型定制的类型安全的类,如下面的代码所示。

Visual Basic 代码

Dim g As New Generic(Of String)

g.Field = "A string"

C# 代码

Generic<string> g = new Generic<string>();

g.Field = "A string";

C++ 代码

Generic<String^>^ g = gcnew Generic<String^>();

g->Field = "A string";

下面的术语用于讨论 .NET Framework 中的泛型:

“泛型类型定义”是用作模板的类、结构或接口声明,其中具有该类、结构或接口声明可以包含或使用的类型的占位符。例如,Dictionary 类可以包含两种类型:键和值。因为它只是一个模板,您不能创建作为泛型类型定义的类、结构或接口的实例。

“泛型类型参数”或称“类型参数”是泛型类型或方法定义中的占位符。Dictionary 泛型类型具有两个类型参数:TKey 和 TValue,分别表示其键和值的类型。

“构造泛型类型”或称“构造类型”是为泛型类型定义的泛型类型参数指定类型得到的结果。

“泛型类型参数”是替换泛型类型参数的任何类型。

一般术语“泛型类型”包括构造类型和泛型类型定义。

“约束”是加在泛型类型参数上的限制。例如,可以将类型参数限制为实现 IComparer 泛型接口的类型以确保可以对该类型的实例进行排序。还可以将类型参数限制为具有特定基类的类型、具有默认构造函数的类型或是引用类型或值类型。泛型类型的用户不能替换不满足这些约束的类型参数。

“泛型方法定义”是具有两个参数列表的方法:一个泛型类型参数列表和一个形参列表。类型参数可以作为返回类型或形参的类型出现,如下面的代码所示。

Visual Basic 代码

Function Generic(Of T)(ByVal arg As T) As T

Dim temp As T = arg

...

End Function

C# 代码

T Generic<T>(T arg) { T temp = arg; ...}

C++ 代码

generic<typename T> T Generic(T arg) { T temp = arg; ...};

泛型方法可以出现在泛型或非泛型类型上。需要注意的是,并不是只要方法属于泛型类型,或者甚至是方法的形参的类型是封闭类型的泛型参数,就可以说方法是泛型方法。只有当方法具有它自己的类型参数列表时,才能称其为泛型方法。在下面的代码中,只有方法 G 是泛型方法。

Visual Basic 代码

Class A

Function G(Of T)(ByVal arg As T) As T

...

End Function

End Class

Class Generic(Of T)

Function M(ByVal arg As T) As T

...

End Function

End Class

C# 代码

class A

{

T G<T>(T arg) {...}

}

class Generic<T>

{

T M(T arg) {...}

}

C++ 代码

ref class A

{

generic<T> T G(T arg) {...};

};

generic<typename T> ref class Generic

{

T M(T arg) {...};

};

Visual C++、C# 和 Visual Basic 都提供了对定义和使用泛型的完全支持。有关更多信息,请参见 Visual Basic 中的泛型类型、泛型介绍(C# 编程指南)和 Overview of Generics in C++。

嵌套类型和泛型

嵌套于泛型类型中的类型依赖于封闭泛型类型的类型参数,公共语言运行库将这样的嵌套类型视为泛型,即使它们没有自己的泛型类型参数。在创建嵌套类型的实例时,需要为所有封闭泛型类型指定类型参数。

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
如何用java替换看不见的字符比如零宽空格&#8203;十六进制U+200B
 干货   2023-09-10
网页字号不能单数吗,网页字体大小为什么一般都是偶数
 干货   2023-09-06
java.lang.ArrayIndexOutOfBoundsException: 4096
 干货   2023-09-06
Noto Sans CJK SC字体下载地址
 干货   2023-08-30
window.navigator和navigator的区别是什么?
 干货   2023-08-23
js获取referer、useragent、浏览器语言
 干货   2023-08-23
oscache遇到404时会不会缓存?
 干货   2023-08-23
linux下用rm -rf *删除大量文件太慢怎么解决?
 干货   2023-08-08
刀郎新歌破世界纪录!
 娱乐   2023-08-01
js实现放大缩小页面
 干货   2023-07-31
生成式人工智能服务管理暂行办法
 百态   2023-07-31
英语学习:过去完成时The Past Perfect Tense举例说明
 干货   2023-07-31
Mysql常用sql命令语句整理
 干货   2023-07-30
科学家复活了46000年前的虫子
 探索   2023-07-29
英语学习:过去进行时The Past Continuous Tense举例说明
 干货   2023-07-28
meta name="applicable-device"告知页面适合哪种终端设备:PC端、移动端还是自适应
 干货   2023-07-28
只用css如何实现打字机特效?
 百态   2023-07-15
css怎么实现上下滚动
 干货   2023-06-28
canvas怎么画一个三角形?
 干货   2023-06-28
canvas怎么画一个椭圆形?
 干货   2023-06-28
canvas怎么画一个圆形?
 干货   2023-06-28
canvas怎么画一个正方形?
 干货   2023-06-28
中国河南省郑州市金水区蜘蛛爬虫ip大全
 干货   2023-06-22
javascript简易动态时间代码
 干货   2023-06-20
感谢员工的付出和激励的话怎么说?
 干货   2023-06-18
 
>>返回首页<<
 
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有