fbpx
维基百科

泛型编程

泛型程序设计英文:generic programming)是程序设计语言的一种风格或范型。泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型。各种程序语言和其编译器运行环境对泛型的支持均不同。AdaDelphiEiffelJavaC#F#SwiftVisual Basic .NET 称之为泛型(generics);MLScalaHaskell 称之为参数多态parametric polymorphism);C++D称之为模板。具有广泛影响的1994年版的《Design Patterns》一书称之为参数化类型(parameterized type)。

泛型的定義及目的 编辑

泛型的定義主要有以下兩種:

  1. 在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表個別对象。(這是當今常見的定義)
  2. 在程序編碼中一些包含參數的。其參數可以代表类或对象等等。(現在人們大多把這稱作模板)

不論使用哪個定義,泛型的參數在真正使用泛型時都必須作出指明。

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

偽代碼例子 编辑

類 例泛類<T> {   值 : T   設置值(新值 : T) {     值 := 新值   }   獲取值() : T {     返回 值   } } 例方法1() {   例物件 : 例泛類<整數型>   例物件 := 新 例泛類<整數型>()   例物件.設置值(5)   輸出整數(例物件.獲取值()) } 例方法2() {   例物件 : 例泛類<浮點數型>   例物件 := 新 例泛類<浮點數型>()   例物件.設置值(5.5)   輸出浮點數(例物件.獲取值()) } 

在這例子中,例泛類是一個泛型,而T是一個類型參數。在例泛類中沒指明T的實際類型,只有例方法1()例方法2()在使用例泛類時才加以指明。

運行這例子的例方法1()將輸出整數5,而運行例方法2()將輸出浮點數5.5。

一些程序语言的泛型特性 编辑

.NET 的泛型 编辑

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

.NET 允許對個別泛型的類型參數進行約束,包括以下幾種形式[1](假設T是泛型的類型參數,C是一般类、泛類,或是泛型的類型參數):

  • T是一個类。
  • T是一個值類型。
  • T具有無參數的公有建構方法。
  • T实现接口I
  • TC,或繼承自C

Java 的泛型 编辑

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

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

Java允許對個別泛型的類型參數進行約束,包括以下兩種形式[2](假設T是泛型的類型參數,C是一般类、泛類,或是泛型的類型參數):

  • T实现接口I
  • TC,或繼承自C

C++的泛型(模板) 编辑

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

#include <type_traits> class B{ ... }; class D: public B{ ... }; template<typename T> void SFINAE(const std::enable_if_t<std::is_base_of<B, T>::value, T> &t); template<typename T> void STATIC_ASSERT(const T &t){  static_assert(std::is_pod<T>::value, "Use with POD types only!"); } 

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

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

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

数据源 编辑

  1. ^ Standard ECMA-335 Common Language Infrastructure (CLI) 4th Edition. June 2006 [2007-08-03]. (原始内容存档于2013-06-26). 
  2. ^ James Gosling, Bill Joy, Guy Steele, Gilad Bracha. The Java Language Specification Third Edition. 2005 [2007-08-03]. (原始内容于2009-02-26). 

參考文獻 编辑

  • Musser, D. R.; Stepanov, A. A. Generic programming. P. Gianni (编). Symbolic and Algebraic Computation: International symposium ISSAC 1988. Lecture Notes in Computer Science 358. 1989: 13–25. ISBN 978-3-540-51084-0. doi:10.1007/3-540-51084-2_2. 
  • Stroustrup, Bjarne. Evolving a language in and for the real world: C++ 1991-2006 (PDF). ACM HOPL 2007. 2007 [2018-04-04]. (原始内容 (PDF)于2007-11-20). 
  • Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John. Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley. 1994. ISBN 0-201-63361-2. 

延伸閱讀 编辑

  • Gabriel Dos Reis and Jaakko Järvi, , .
  • Gibbons, Jeremy. Backhouse, R.; Gibbons, J.; Hinze, R.; Jeuring, J. , 编. Datatype-generic programming. Spring School on Datatype-Generic Programming 2006. Lecture Notes in Computer Science 4719. Heidelberg: Springer: 1–71. 2007. CiteSeerX 10.1.1.159.1228 . 
  • Bertrand Meyer. "Genericity vs Inheritance (页面存档备份,存于互联网档案馆)." In OOPSLA (First ACM Conference on Object-Oriented Programming Systems, Languages and Applications), Portland (Oregon), 29 September–2 October 1986, pages 391–405.

外部連結 编辑

  • generic-programming.org (页面存档备份,存于互联网档案馆
  • Alexander A. Stepanov, Collected Papers of Alexander A. Stepanov (页面存档备份,存于互联网档案馆) (creator of the STL)
C++/D
  • Walter Bright, Templates Revisited (页面存档备份,存于互联网档案馆).
  • David Vandevoorde, Nicolai M Josuttis, C++ Templates: The Complete Guide, 2003 Addison-Wesley. ISBN 0-201-73484-2
C#/.NET
  • Jason Clark, "Introducing Generics in the Microsoft CLR (页面存档备份,存于互联网档案馆)," September 2003, MSDN Magazine, Microsoft.
  • Jason Clark, "More on Generics in the Microsoft CLR (页面存档备份,存于互联网档案馆)," October 2003, MSDN Magazine, Microsoft.
  • M. Aamir Maniar, Generics.Net (页面存档备份,存于互联网档案馆). An open source generics library for C#.
Delphi/Object Pascal
  • Nick Hodges, "Delphi 2009 Reviewers Guide (页面存档备份,存于互联网档案馆)," October 2008, Embarcadero Developer Network, Embarcadero.
  • Craig Stuntz, "," October 2008
  • Dr. Bob, "Delphi 2009 Generics (页面存档备份,存于互联网档案馆)"
  • Free Pascal: Free Pascal Reference guide Chapter 8: Generics (页面存档备份,存于互联网档案馆), Michaël Van Canneyt, 2007
  • Delphi for Win32: Generics with Delphi 2009 Win32 (页面存档备份,存于互联网档案馆), Sébastien DOERAENE, 2008
  • Delphi for .NET: Delphi Generics (页面存档备份,存于互联网档案馆), Felix COLIBRI, 2008
Eiffel
  • Eiffel ISO/ECMA specification document (页面存档备份,存于互联网档案馆
Haskell
  • Johan Jeuring, Sean Leather, José Pedro Magalhães, and Alexey Rodriguez Yakushev. Libraries for Generic Programming in Haskell. Utrecht University.
  • Dæv Clarke, Johan Jeuring and Andres Löh, The Generic Haskell user's guide (页面存档备份,存于互联网档案馆
  • Ralf Hinze, "Generics for the Masses (页面存档备份,存于互联网档案馆)," In Proceedings of the ACM SIGPLAN International Conference on Functional Programming (ICFP), 2004.
  • Simon Peyton Jones, editor, The Haskell 98 Language Report (页面存档备份,存于互联网档案馆), Revised 2002.
  • Ralf Lämmel and Simon Peyton Jones, "Scrap Your Boilerplate: A Practical Design Pattern for Generic Programming," In Proceedings of the ACM SIGPLAN International Workshop on Types in Language Design and Implementation (TLDI'03), 2003. (Also see the website )
  • Andres Löh, , Ph.D. thesis, 2004 Utrecht University. ISBN 90-393-3765-9
  • Generic Haskell: a language for generic programming (页面存档备份,存于互联网档案馆
Java
  • Gilad Bracha, Generics in the Java Programming Language (页面存档备份,存于互联网档案馆), 2004.
  • Maurice Naftalin and Philip Wadler, Java Generics and Collections, 2006, O'Reilly Media, Inc. ISBN 0-596-52775-6
  • Peter Sestoft, Java Precisely, Second Edition, 2005 MIT Press. ISBN 0-262-69325-9
  • Java SE 7, 2004 Sun Microsystems, Inc.
  • Angelika Langer, Java Generics FAQs (页面存档备份,存于互联网档案馆

泛型编程, 此條目的语调或风格可能不適合百科全書的寫作方式, 2020年9月21日, 請根據指南協助改善这篇条目, 請在讨论页討論問題所在及加以改善, 此條目可参照英語維基百科相應條目来扩充, 2020年9月21日, 若您熟悉来源语言和主题, 请协助参考外语维基百科扩充条目, 请勿直接提交机械翻译, 也不要翻译不可靠, 低品质内容, 依版权协议, 译文需在编辑摘要注明来源, 或于讨论页顶部标记, href, template, translated, page, html, title, template, tra. 此條目的语调或风格可能不適合百科全書的寫作方式 2020年9月21日 請根據指南協助改善这篇条目 請在讨论页討論問題所在及加以改善 此條目可参照英語維基百科相應條目来扩充 2020年9月21日 若您熟悉来源语言和主题 请协助参考外语维基百科扩充条目 请勿直接提交机械翻译 也不要翻译不可靠 低品质内容 依版权协议 译文需在编辑摘要注明来源 或于讨论页顶部标记 a href Template Translated page html title Template Translated page Translated page a 标签 泛型程序设计 英文 generic programming 是程序设计语言的一种风格或范型 泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型 在实例化时作为参数指明这些类型 各种程序语言和其编译器 运行环境对泛型的支持均不同 Ada Delphi Eiffel Java C F Swift 和 Visual Basic NET 称之为泛型 generics ML Scala 和 Haskell 称之为参数多态 parametric polymorphism C 和 D称之为模板 具有广泛影响的1994年版的 Design Patterns 一书称之为参数化类型 parameterized type 目录 1 泛型的定義及目的 2 偽代碼例子 3 一些程序语言的泛型特性 3 1 NET 的泛型 3 2 Java 的泛型 3 3 C 的泛型 模板 4 数据源 5 參考文獻 6 延伸閱讀 7 外部連結泛型的定義及目的 编辑泛型的定義主要有以下兩種 在程序编码中一些包含类型参数的类型 也就是说泛型的参数只可以代表类 不能代表個別对象 這是當今常見的定義 在程序編碼中一些包含參數的类 其參數可以代表类或对象等等 現在人們大多把這稱作模板 不論使用哪個定義 泛型的參數在真正使用泛型時都必須作出指明 一些强類型程序語言支持泛型 其主要目的是加强類型安全及减少類转换的次数 但一些支持泛型的程序語言只能達到部份目的 偽代碼例子 编辑類 例泛類 lt T gt 值 T 設置值 新值 T 值 新值 獲取值 T 返回 值 例方法1 例物件 例泛類 lt 整數型 gt 例物件 新 例泛類 lt 整數型 gt 例物件 設置值 5 輸出整數 例物件 獲取值 例方法2 例物件 例泛類 lt 浮點數型 gt 例物件 新 例泛類 lt 浮點數型 gt 例物件 設置值 5 5 輸出浮點數 例物件 獲取值 在這例子中 例泛類是一個泛型 而T是一個類型參數 在例泛類中沒指明T的實際類型 只有例方法1 和例方法2 在使用例泛類時才加以指明 運行這例子的例方法1 將輸出整數5 而運行例方法2 將輸出浮點數5 5 一些程序语言的泛型特性 编辑 NET 的泛型 编辑 主条目 NET Framework泛型 NET 泛型的参数只可以代表类 不能代表个别对象 由于 NET 泛型的类型参数之实际类型在运行时均不会被消除 运行速度会因为类型转换的次数减少而加快 另外 使用GetType 方法可于程序运行时得知泛型及其类型参数的实际类型 更可以运用反射式编程 NET 允許對個別泛型的類型參數進行約束 包括以下幾種形式 1 假設T是泛型的類型參數 C是一般类 泛類 或是泛型的類型參數 T是一個类 T是一個值類型 T具有無參數的公有建構方法 T实现接口I T是C 或繼承自C Java 的泛型 编辑 参见 Java和Java 5 0 Java 泛型的参数只可以代表类 不能代表个别对象 由于Java泛型的类型参数之实际类型在编译时会被消除 所以无法在运行时得知其类型参数的类型 而且无法直接使用基本值类型作为泛型类型参数 Java编译程序在编译泛型时会自动加入类型转换的编码 故运行速度不会因为使用泛型而加快 由于运行时会消除泛型的对象实例类型信息等缺陷经常被人詬病 Java及JVM的开发方面也尝试解决这个问题 例如 Java通过在生成字节码时添加类型推导辅助信息 从而可以通过反射接口获得部分泛型信息 通过改进泛型在JVM的实现 使其支持基本值类型泛型和直接获得泛型信息等 Java允許對個別泛型的類型參數進行約束 包括以下兩種形式 2 假設T是泛型的類型參數 C是一般类 泛類 或是泛型的類型參數 T实现接口I T是C 或繼承自C C 的泛型 模板 编辑 C 泛型的参数可以代表类或个别对象 在一般意义上 C 缺乏对泛型的类型参数进行直接约束的手段 但可利用 SFINAE 模板代换失败非错误 指在模板实例化过程中的错误仅意味此次代换失败 并不一定产生编译错误 规则及 C 11 的 static assert 等实现相似功能 include lt type traits gt class B class D public B template lt typename T gt void SFINAE const std enable if t lt std is base of lt B T gt value T gt amp t template lt typename T gt void STATIC ASSERT const T amp t static assert std is pod lt T gt value Use with POD types only 如上所示 std enable if std enable if t lt boolean Type gt 是 std enable if lt boolean Type gt type 的缩写 利用 SFINAE 规则来实现模板类型参数约束的手段之一 其实现方式是若布尔判断为假 则把类型设为 void 而这将导致 const void amp 这种不合法的类型出现 从而禁止这种类型参数的使用 static assert 则在布尔判断失败时把后面的字符串作为消息内容报告为编译错误 在编译时 每个被使用的封闭泛型类型 即是所有泛型参数的实际类型都已被指明的泛型 都会有独立的编码产生 编译程序会在此时确保类型安全性 可是如果泛型要运用其泛型参数的某成员 而该泛型参数又不包含该成员的时候 编译程序所产生的错误信息或会看似与实际问题无关 增加除错的难度 数据源 编辑 Standard ECMA 335 Common Language Infrastructure CLI 4th Edition June 2006 2007 08 03 原始内容存档于2013 06 26 引文格式1维护 冗余文本 link James Gosling Bill Joy Guy Steele Gilad Bracha The Java Language Specification Third Edition 2005 2007 08 03 原始内容存档于2009 02 26 引文格式1维护 冗余文本 link 參考文獻 编辑Musser D R Stepanov A A Generic programming P Gianni 编 Symbolic and Algebraic Computation International symposium ISSAC 1988 Lecture Notes in Computer Science 358 1989 13 25 ISBN 978 3 540 51084 0 doi 10 1007 3 540 51084 2 2 Stroustrup Bjarne Evolving a language in and for the real world C 1991 2006 PDF ACM HOPL 2007 2007 2018 04 04 原始内容存档 PDF 于2007 11 20 Gamma Erich Helm Richard Johnson Ralph Vlissides John Design Patterns Elements of Reusable Object Oriented Software Addison Wesley 1994 ISBN 0 201 63361 2 延伸閱讀 编辑Gabriel Dos Reis and Jaakko Jarvi What is Generic Programming LCSD 2005 Gibbons Jeremy Backhouse R Gibbons J Hinze R Jeuring J 编 Datatype generic programming Spring School on Datatype Generic Programming 2006 Lecture Notes in Computer Science 4719 Heidelberg Springer 1 71 2007 CiteSeerX 10 1 1 159 1228 nbsp Bertrand Meyer Genericity vs Inheritance 页面存档备份 存于互联网档案馆 In OOPSLA First ACM Conference on Object Oriented Programming Systems Languages and Applications Portland Oregon 29 September 2 October 1986 pages 391 405 外部連結 编辑generic programming org 页面存档备份 存于互联网档案馆 Alexander A Stepanov Collected Papers of Alexander A Stepanov 页面存档备份 存于互联网档案馆 creator of the STL C DWalter Bright Templates Revisited 页面存档备份 存于互联网档案馆 David Vandevoorde Nicolai M Josuttis C Templates The Complete Guide 2003 Addison Wesley ISBN 0 201 73484 2C NETJason Clark Introducing Generics in the Microsoft CLR 页面存档备份 存于互联网档案馆 September 2003 MSDN Magazine Microsoft Jason Clark More on Generics in the Microsoft CLR 页面存档备份 存于互联网档案馆 October 2003 MSDN Magazine Microsoft M Aamir Maniar Generics Net 页面存档备份 存于互联网档案馆 An open source generics library for C Delphi Object PascalNick Hodges Delphi 2009 Reviewers Guide 页面存档备份 存于互联网档案馆 October 2008 Embarcadero Developer Network Embarcadero Craig Stuntz Delphi 2009 Generics and Type Constraints October 2008 Dr Bob Delphi 2009 Generics 页面存档备份 存于互联网档案馆 Free Pascal Free Pascal Reference guide Chapter 8 Generics 页面存档备份 存于互联网档案馆 Michael Van Canneyt 2007 Delphi for Win32 Generics with Delphi 2009 Win32 页面存档备份 存于互联网档案馆 Sebastien DOERAENE 2008 Delphi for NET Delphi Generics 页面存档备份 存于互联网档案馆 Felix COLIBRI 2008EiffelEiffel ISO ECMA specification document 页面存档备份 存于互联网档案馆 HaskellJohan Jeuring Sean Leather Jose Pedro Magalhaes and Alexey Rodriguez Yakushev Libraries for Generic Programming in Haskell Utrecht University Daev Clarke Johan Jeuring and Andres Loh The Generic Haskell user s guide 页面存档备份 存于互联网档案馆 Ralf Hinze Generics for the Masses 页面存档备份 存于互联网档案馆 In Proceedings of the ACM SIGPLAN International Conference on Functional Programming ICFP 2004 Simon Peyton Jones editor The Haskell 98 Language Report 页面存档备份 存于互联网档案馆 Revised 2002 Ralf Lammel and Simon Peyton Jones Scrap Your Boilerplate A Practical Design Pattern for Generic Programming In Proceedings of the ACM SIGPLAN International Workshop on Types in Language Design and Implementation TLDI 03 2003 Also see the website devoted to this research Andres Loh Exploring Generic Haskell Ph D thesis 2004 Utrecht University ISBN 90 393 3765 9 Generic Haskell a language for generic programming 页面存档备份 存于互联网档案馆 JavaGilad Bracha Generics in the Java Programming Language 页面存档备份 存于互联网档案馆 2004 Maurice Naftalin and Philip Wadler Java Generics and Collections 2006 O Reilly Media Inc ISBN 0 596 52775 6 Peter Sestoft Java Precisely Second Edition 2005 MIT Press ISBN 0 262 69325 9 Java SE 7 2004 Sun Microsystems Inc Angelika Langer Java Generics FAQs 页面存档备份 存于互联网档案馆 取自 https zh wikipedia org w index php title 泛型编程 amp oldid 78599676, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。