泛型编程

泛型程序设计英文: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()方法可于程序运行时得知泛型及其类型参数的实际类型,更可以运用反射式编程

using System;

// 定義一個泛型列表類,T 表示類型參數
public class GenericList<T>
{
    private T[] _items; // 存儲列表items的數組
    private int _count; // 列表中items的計數

    // 構造函數,初始化列表的容量
    public GenericList(int capacity)
    {
        _items = new T[capacity];
        _count = 0;
    }

    // 添加item到列表中
    public void Add(T item)
    {
        if (_count < _items.Length)
        {
            _items[_count] = item;
            _count++;
        }
        else
        {
            Console.WriteLine("List capacity reached."); // 列表容量已滿
        }
    }

    // 根據索引獲取列表中的item
    public T GetItem(int index)
    {
        if (index >= 0 && index < _count)
        {
            return _items[index];
        }
        else
        {
            throw new IndexOutOfRangeException("Index out of range."); // 索引超出範圍
        }
    }
}

public class Program
{
    public static void Main()
    {
        // 創建一個存儲整數的泛型列表
        GenericList<int> intList = new GenericList<int>(3);
        intList.Add(1);
        intList.Add(2);
        intList.Add(3);
        Console.WriteLine(intList.GetItem(1));  // 輸出: 2

        // 創建一個存儲字符串的泛型列表
        GenericList<string> stringList = new GenericList<string>(2);
        stringList.Add("Hello");
        stringList.Add("World");
        Console.WriteLine(stringList.GetItem(0));  // 輸出: Hello
    }
}

在上面的例子中展示了一個簡單的泛型列表類 GenericList<T>,它可以存儲任何類型的數據(由 T 指定)。Program 類中的 Main 方法演示了如何使用這個泛型類來存儲和檢索整數和字符串。

.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). 

參考文獻

延伸閱讀

外部連結

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
Delphi/Object Pascal
Eiffel
Haskell
Java


Read other articles:

For the Mobile, Alabama station, see WMOB. Radio station in Quincy, IllinoisWLIQQuincy, IllinoisFrequency1530 kHzBrandingKick AM 1530ProgrammingFormatClassic CountryOwnershipOwnerTownsquare Media Group(Townsquare License, LLC)HistoryFirst air dateDecember 13, 1966 (1966-12-13) (in Bowling Green, Missouri)[1]Former call signsKPCR (1966–2006)Technical informationFacility ID52576ClassDPower1,400 watts290 watts critical hoursLinksWebcastListen LiveWebsitekickam1530.com WL...

 

This article is about the city in France. For the sportscar endurance race, see 24 Hours of Le Mans. For racecar type, see Le Mans Prototype. For other uses, see Le Mans (disambiguation). Prefecture and commune in Pays de la Loire, FranceLe MansPrefecture and communeTop row: left, Le Mans 24-hr automobile race in June; right, Le Mans Justice Department Office; Middle row: View of Sarthe River and historic area, including the Palais of Comtes du Maine; Bottom row: left, Le Mans Tramway in Gamb...

 

Minesweeper of the United States Navy For other ships with the same name, see USS Grouse. Minesweeper USS Grouse underway History United States NameUSS YMS-321 BuilderAl Larson Boat Building Laid down29 August 1942[1] Launched20 February 1943 Sponsored byMrs. H. Doty Completed25 October 1943[1] Commissioned25 October 1943 RenamedUSS Grouse (AMS-15), 18 February 1947 Namesakethe grouse bird Decommissioned12 September 1957 In service13 November 1958, Naval Reserve training ship ...

American legislative district Maryland's legislative district 30ARepresentspart of Anne Arundel CountyDelegate(s)Dana Jones (D)Shaneka Henson (D)Registration48.0% Democratic29.5% Republican21.1% unaffiliatedDemographics66.8% White14.2% Black/African American0.5% Native American2.4% Asian0.0% Hawaiian/Pacific Islander8.5% Other race7.4% Two or more races14.7% HispanicPopulation (2020)82,120Voting-age population66,039Registered voters5...

 

This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Mezőcsát – news · newspapers · books · scholar · JSTOR (October 2019) (Learn how and when to remove this template message) Town in Borsod-Abaúj-Zemplén, HungaryMezőcsátTownAerial view FlagCoat of armsMezőcsátCoordinates: 47°49′N 20°54′E / ...

 

1953 Mediterranean Sea mid-air collisionAccidentDate15 January 1953SummaryMid-air collisionSiteover the Strait of SicilyTotal fatalities26Total survivors0First aircraft A Vickers Valetta similar to the accident aircraftTypeVickers Valetta C1Operator Royal Air ForceRegistrationVX562Flight originRAF LuqaPassengers16Crew3Fatalities19Survivors0Second aircraft An Avro Lancaster similar to the accident aircraftTypeAvro Lancaster GR3Operator Royal Air ForceRegistrationTX270Crew7Fatalities...

2008 American filmConfessionsofa Ex-Doofus-ItchyFooted MuthaDirected byMelvin Van PeeblesWritten byMelvin Van PeeblesProduced byMelvin Van PeeblesStarringMelvin Van PeeblesCinematographyGiles FrancisJohn ThreatEdited byMelvin Van PeeblesRelease date 2008 (2008) Running time99 minutesCountryUnited StatesLanguageEnglishBox office$1,717 ConfessionsOfa Ex-Doofus-ItchyFooted Mutha is a 2008 film by Melvin Van Peebles. It is based on Van Peebles' 1982 Broadway musical Waltz of the Stork and hi...

 

この項目には、一部のコンピュータや閲覧ソフトで表示できない文字が含まれています(詳細)。 数字の大字(だいじ)は、漢数字の一種。通常用いる単純な字形の漢数字(小字)の代わりに同じ音の別の漢字を用いるものである。 概要 壱万円日本銀行券(「壱」が大字) 弐千円日本銀行券(「弐」が大字) 漢数字には「一」「二」「三」と続く小字と、「壱」「�...

 

TAF3 التراكيب المتوفرة بنك بيانات البروتينOrtholog search: PDBe RCSB قائمة رموز معرفات بنك بيانات البروتين 5C13 المعرفات الأسماء المستعارة TAF3, TAF140, TAFII-140, TAFII140, TATA-box binding protein associated factor 3 معرفات خارجية الوراثة المندلية البشرية عبر الإنترنت 606576 MGI: MGI:2388097 HomoloGene: 35415 GeneCards: 83860 علم الوجود الجيني...

Sum of product fitness processes in a business This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these template messages) This article includes a list of general references, but it lacks sufficient corresponding inline citations. Please help to improve this article by introducing more precise citations. (September 2010) (Learn how and when to remove this message) This article needs additional citations for verifica...

 

此条目序言章节没有充分总结全文内容要点。 (2019年3月21日)请考虑扩充序言,清晰概述条目所有重點。请在条目的讨论页讨论此问题。 哈萨克斯坦總統哈薩克總統旗現任Қасым-Жомарт Кемелұлы Тоқаев卡瑟姆若马尔特·托卡耶夫自2019年3月20日在任任期7年首任努尔苏丹·纳扎尔巴耶夫设立1990年4月24日(哈薩克蘇維埃社會主義共和國總統) 哈萨克斯坦 哈萨克斯坦政府...

 

Penyuara jemala stereoPenyuara telinga EarPods dari Apple. Penyuara telinga (bahasa Inggris: earphone) atau penyuara jemala (headphone) adalah sepasang pengeras suara kecil yang digunakan sangat dekat dengan telinga. Pada bidang-bidang tertentu, perangkat ini juga dikenal dengan istilah lain, yaitu penyuara kuping (Fisika dan Elektronika), fon telinga (Elektronika), peranti dengar (Komunikasi Massa) atau pelantang telinga (Umum). Ketika memakainya, alat ini terhubung dengan frekuensi audi...

Academic journalMiddle East Review of International AffairsLanguageEnglishEdited byJonathan SpyerPublication detailsPublisherRubin Center for Research in International AffairsStandard abbreviationsISO 4 (alt) · Bluebook (alt1 · alt2)NLM (alt) · MathSciNet (alt )ISO 4Middle East Rev. Int. Aff.IndexingCODEN (alt · alt2) · JSTOR (alt) · LCCN (alt)MIAR · NLM (alt) · ScopusISSN1565-...

 

Artikel ini tidak memiliki referensi atau sumber tepercaya sehingga isinya tidak bisa dipastikan. Tolong bantu perbaiki artikel ini dengan menambahkan referensi yang layak. Tulisan tanpa sumber dapat dipertanyakan dan dihapus sewaktu-waktu.Cari sumber: Resimen mahasiswa – berita · surat kabar · buku · cendekiawan · JSTOR Resimen Mahasiswa (disingkat Menwa) adalah salah satu kekuatan sipil yang dilatih dan dipersiapkan untuk mempertahankan NKRI sebagai ...

 

Railway Station in Maharashtra, India Not to be confused with Kandivli railway station. This article does not cite any sources. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Khadavli railway station – news · newspapers · books · scholar · JSTOR (February 2019) (Learn how and when to remove this message) Khadavli Indian Railways and Mumbai Suburban Railway station...

Voce principale: Football-Club Bulle. Football-Club BulleStagione 2021-2022Sport calcio Squadra Bulle Allenatore Lucien Dénervaud All. in seconda François Bonetti Prima Lega3º posto Coppa SvizzeraSecondo turno StadioStade de Bouleyres Maggior numero di spettatori480 vs. Vevey United Minor numero di spettatori287 vs. Lancy Media spettatori387 2020-2021 2022-2023 Si invita a seguire il modello di voce Questa voce raccoglie le informazioni riguardanti il Football-Club Bulle nelle compet...

 

Questa voce sull'argomento architetture della provincia di Mantova è solo un abbozzo. Contribuisci a migliorarla secondo le convenzioni di Wikipedia. Portici gonzagheschiLocalizzazioneStato Italia LocalitàGazzuolo IndirizzoVia Roma Coordinate45°04′08″N 10°35′00″E45°04′08″N, 10°35′00″E Informazioni generaliCondizioniIn uso CostruzioneXVI secolo RealizzazioneArchitettoAndrea Bertazzolo AppaltatoreLudovico Gonzaga Modifica dati su Wikidata · Manuale I porti...

 

ياسر حارب   معلومات شخصية الميلاد 21 أكتوبر 1978 (46 سنة)  إمارة دبي  الإقامة دبي مواطنة الإمارات العربية المتحدة  الحياة العملية المهنة كاتب وإعلامي، مؤسس جينوميديا للإنتاج سبب الشهرة تأليف كتاب بيكاسو ستاربكس الرياضة كرة القدم  المواقع الموقع yhareb.com تعديل مصدري -...

Type of interface based on outputting to or controlling a text display Not to be confused with Command-line interface. This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Text-based user interface – news · newspapers · books · scholar · JSTOR (September 2014) (Learn how and when to remove this message) Some file...

 

Species of passerine bird found in chaparral habitats California thrasher In California Song Conservation status Least Concern  (IUCN 3.1)[1] Scientific classification Domain: Eukaryota Kingdom: Animalia Phylum: Chordata Class: Aves Order: Passeriformes Family: Mimidae Genus: Toxostoma Species: T. redivivum Binomial name Toxostoma redivivum(Gambel, 1845) California thrasher range The California thrasher (Toxostoma redivivum) is a large member of family Mimidae found primaril...