族谱网 头条 人物百科

泛型

2020-10-16
出处:族谱网
作者:阿族小谱
浏览:599
转发:0
评论:0
泛型的定义及目的泛型的定义主要有以下两种:在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个别对象。(这是当今较常见的定义)在程序编码中一些包含参数的类。其参数可以代表类或对象等等。(现在人们大多把这称作模板)不论使用那个定义,泛型的参数在真正使用泛型时都必须作出指明。一些强类型程序语言支持泛型,其主要目的是加强类型安全及减少类转换的次数,但一些支持泛型的程序语言只能达到部分目的。伪代码例子類例泛類{值:T設置值(新值:T){值:=新值}獲取值():T{返回值}}例方法1(){例物件:例泛類例物件:=新例泛類()例物件.設置值(5)输出整数(例对象.获取值())}例方法2(){例物件:例泛類例物件:=新例泛類()例物件.設置值(5.5)输出浮点数(例对象.获取值())}在这例子中,例泛类是一个泛型,而T是一个类型参数。在例泛类中没指明T的实际类型,只有例方法1(...

泛型的定义及目的

泛型的定义主要有以下两种:

在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个别对象。(这是当今较常见的定义)

在程序编码中一些包含参数的类。其参数可以代表类或对象等等。(现在人们大多把这称作模板)

不论使用那个定义,泛型的参数在真正使用泛型时都必须作出指明。

一些强类型程序语言支持泛型,其主要目的是加强类型安全及减少类转换的次数,但一些支持泛型的程序语言只能达到部分目的。

伪代码例子

類 例泛類 {   值 : T   設置值(新值 : T) {     值 := 新值   }   獲取值() : T {     返回 值   } } 例方法1() {   例物件 : 例泛類   例物件 := 新 例泛類()   例物件.設置值(5)   输出整数(例对象.获取值()) } 例方法2() {   例物件 : 例泛類   例物件 := 新 例泛類()   例物件.設置值(5.5)   输出浮点数(例对象.获取值()) }

在这例子中,例泛类是一个泛型,而T是一个类型参数。在例泛类中没指明T的实际类型,只有例方法1()和例方法2()在使用例泛类时才加以指明。

运行这例子的例方法1()将输出整数5,而运行例方法2()将输出浮点数5.5。

一些程序语言的泛型特性

.NET Framework的泛型

.NET Framework泛型的参数只可以代表类,不能代表个别对象。由于.NET Framework泛型的类型参数之实际类型在运行时均不会被消除,运行速度会因为类型转换的次数减少而加快。另外,使用GetType()方法可于程序运行时得知泛型及其类型参数的实际类型,更可以运用反射编程。

.NET Framework允许对个别泛型的类型参数进行约束,包括以下几种形式(假设T是泛型的类型参数,C是一般类、泛类,或是泛型的类型参数):

T是一个类。

T是一个值类型。

T具有无参数的公有建构方法。

T实现界面I。

T是C,或继承自C。

Java的泛型

Java泛型的参数只可以代表类,不能代表个别对象。由于Java泛型的类型参数之实际类型在编译时会被消除,所以无法在运行时得知其类型参数的类型,而且无法直接使用基本值类型作为泛型类型参数。Java编译程序在编译泛型时会自动加入类型转换的编码,故运行速度不会因为使用泛型而加快。

由于运行时会消除泛型的对象实例类型信息等缺陷经常被人诟病,Java及JVM的开发方面也尝试解决这个问题,例如Java通过在生成字节码时添加类型推导辅助信息,从而可以通过反射接口获得部分泛型信息。通过改进泛型在JVM的实现,使其支持基本值类型泛型和直接获得泛型信息等。

Java允许对个别泛型的类型参数进行约束,包括以下两种形式(假设T是泛型的类型参数,C是一般类、泛类,或是泛型的类型参数):

T实现接口I。

T是C,或继承自C。

C++的泛型(模板)

C++泛型的参数可以代表类或个别对象。在一般意义上,C++ 缺乏对泛型的类型参数进行直接约束的手段,但可利用 SFINAE(模板代换失败非错误,指在模板实例化过程中的错误仅意味此次代换失败,并不一定产生编译错误)规则及C++11的 static_assert 等实现相似功能。

#includeclassB{...};classD:publicB{...};templatevoidSFINAE(conststd::enable_if_t<std::is_base_of::value,T>&t);templatevoidSTATIC_ASSERT(constT&t){static_assert(std::is_pod::value,"Use with POD types only!");}

如上所示,std::enable_if(std::enable_if_t 是 std::enable_if::type 的缩写)利用 SFINAE 规则来实现模板类型参数约束的手段之一。其实现方式是若布尔判断为假,则把类型设为 void,而这将导致 const void & 这种不合法的类型出现,从而禁止这种类型参数的使用。

static_assert 则在布尔判断失败时把后面的字符串作为消息内容报告为编译错误。

在编译时,每个被使用的封闭泛型类型(即是所有泛型参数的实际类型都已被指明的泛型)都会有独立的编码产生,编译程序会在此时确保类型安全性。可是如果泛型要运用其泛型参数的某成员,而该泛型参数又不包含该成员的时候,编译程序所产生的错误信息或会看似与实际问题无关,增加除错的难度。


免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。

——— 没有了 ———
编辑:阿族小谱
发表评论
写好了,提交
{{item.label}}
{{commentTotal}}条评论
{{item.userName}}
发布时间:{{item.time}}
{{item.content}}
回复
举报
点击加载更多
打赏作者
“感谢您的打赏,我会更努力的创作”
— 请选择您要打赏的金额 —
{{item.label}}
{{item.label}}
打赏成功!
“感谢您的打赏,我会更努力的创作”
返回

更多文章

更多精彩文章
打赏
私信

推荐阅读

· 泛函
例子对偶性观察映射是一个函数,在这里,x0{\displaystylex_{0}}是函数f的自变量。同时,将函数映射至一个点的函数值是一个泛函,在此x0{\displaystylex_{0}}是一个参数只要f{\displaystylef}是一个从向量空间至一个布于实数的体的线性转换,上述的线性映射彼此对偶,那么在泛函分析上,这两者都称作线性泛函。参见线性泛函最优化张量参考资料MathWorld上Functional的资料,作者:Rowland,Todd。Lang,Serge,III.Modules,§6.Thedualspaceanddualmodule,Algebra,GraduateTextsinMathematics211Revisedthird,NewYork:Springer-Verlag:142–146,2002,ISBN978-0-387-95385-4,MR18...
· 泛代数
基本构思从泛代数角度来看,代数是个集合A拥有一组算子。在A上的一个n元运算是个函数以n个A的元素为输入并返回一个A的元素。无元运算:产生常数a单元运算:例如~x二元运算:x*y除了运算,还有符合一些公理及方程式定律,例如结合律、交换律等等。相关条目调和分析测度分析微分几何及拓扑代数拓扑代数几何抽象代数
· 泛函分析
赋范线性空间从现代观点来看,泛函分析研究的主要是实数域或复数域上的完备赋范线性空间。这类空间被称为巴拿赫空间,巴拿赫空间中最重要的特例被称为希尔伯特空间,其上的范数由一个内积导出。这类空间是量子力学数学描述的基础。更一般的泛函分析也研究Fréchet空间和拓扑向量空间等没有定义范数的空间。泛函分析所研究的一个重要对象是巴拿赫空间和希尔伯特空间上的连续线性算子。这类算子可以导出C*-代数和其他算子代数的基本概念。希尔伯特空间希尔伯特空间(Hilbert)可以利用以下结论完全分类,即对于任意两个希尔伯特空间,若其基的基数相等,则它们必彼此同构。对于有限维希尔伯特空间而言,其上的连续线性算子即是线性代数中所研究的线性变换。对于无穷维希尔伯特空间而言,其上的任何态射均可以分解为可数维度(基的基数为ℵ0)上的态射,所以泛函分析主要研究可数维度上的希尔伯特空间及其态射。希尔伯特空间中的一个尚未完全解决...
· 泛驾之马
【成语】泛驾之马【成语】泛驾之马【读音】fěngjiàzhīmǎ【释义】泛驾:不服人驾驭。不服从驾驭的马。马有逸气而不循轨辙。泛,通“覆”。比喻很有才能而不循旧规的人。也形容敢于创新的人。【出处】《汉书·武帝纪》:“夫泛驾之马,跅驰之士,亦在御之而已。”
· 泛函谓词
介入新的函数符号在允许介入新的谓词符号的谓词逻辑系统中,你可能也想介入新的函数符号。从旧的函数符号介入新的函数符号是容易的;给定函数符号F和G,有一个新函数符号FoG,它是F和G的复合,对于所有x,满足(FoG)(x)=F(G(x))。当然,等式的右边在有类型的逻辑中没有意义,除非F的域类型匹配G的陪域类型,这是定义复合的要求。你还自动的获得特定的函数符号。在无类型逻辑中,有一个恒等谓词id,对于所有X满足id(x)=x。在有类型逻辑中,给定任何类型T,有一个恒等谓词idT,带有域和陪域类型T;对于类型T的所有x,它满足idT(x)=x。类似的,如果T是U的一个子类型,则有一个域类型T和陪域类型U的包含谓词,它满足相同的等式;有与从旧类型构造新类型的其他方式相关联的额外的函数符号。此外,你可以在证明了适当的定理之后定义泛函谓词。(如果你在证明了定理之后不允许介入新符号的形式系统下工作,那么...

关于我们

关注族谱网 微信公众号,每日及时查看相关推荐,订阅互动等。

APP下载

下载族谱APP 微信公众号,每日及时查看
扫一扫添加客服微信