1. 程式人生 > >為什麼要使用泛型?

為什麼要使用泛型?

為什麼要使用泛型

  通過泛型可以定義型別安全的資料結構(型別安全),而無須使用實際的資料型別(可擴充套件)。這能夠顯著提高效能並得到更高質量的程式碼(高效能),因為您可以重用資料處理演算法,而無須複製型別特定的程式碼(可重用)。在概念上,泛型類似於 C++ 模板,但是在實現和功能方面存在明顯差異。

  考慮一種普通的、提供傳統 Push() 和 Pop() 方法的資料結構(例如,堆疊)。在開發通用堆疊時,您可能願意使用它來儲存各種型別的例項。您可以使用基於 Object 的堆疊,這意味著,在該堆疊中使用的內部資料型別是難以歸類的 Object,並且堆疊方法與 Object 互動:

  

  上述容器可按下述方式使用:

  

  基於 Object 的解決方案存在兩個問題。

  第一個問題是效能。在使用值型別時,必須boxing & unboxing。裝箱和取消裝箱都會根據它們自己的許可權造成重大的效能損失,但是它還會增加託管堆上的壓力,導致更多的垃圾收集工作,而這對於效能而言也不太好。即使是在使用引用型別而不是值型別時,仍然存在效能損失,這是因為必須從 Object 向您要與之互動的實際型別進行強制型別轉換,從而造成強制型別轉換開銷。

  基於 Object 的解決方案的第二個問題(通常更為嚴重)是型別安全。因為編譯器允許在任何型別和 Object 之間進行強制型別轉換,所以您將丟失編譯時型別安全。例如,以下程式碼可以正確編譯,但是在執行時將引發無效強制型別轉換異常:  

  

  您可以通過提供型別特定的(因而是型別安全的)高效能堆疊來克服上述兩個問題。對於整型,可以實現並使用 IntStack。對於字串,可以實現 StringStack。

  遺憾的是,以這種方式解決效能和型別安全問題,會引起第三個同樣嚴重的問題 — 影響工作效率(無法重用)。編寫型別特定的資料結構是一項乏味的、重複性的且易於出錯的任務。在修復該資料結構中的缺陷時,您不能只在一個位置修復該缺陷,而必須在實質上是同一資料結構的型別特定的副本所出現的每個位置進行修復。此外,沒有辦法預知未知的或尚未定義的將來型別的使用情況,因此還必須保持基於 Object 的資料結構。

【什麼是泛型】

  

  在一些 C++ 編譯器中,在您通過特定型別使用模板類之前,編譯器甚至不會編譯模板程式碼。當您確實指定了型別時,編譯器會以內聯方式插入程式碼,並且將每個出現一般型別引數的地方替換為指定的型別。此外,每當您使用特定型別時,編譯器都會插入特定於該型別的程式碼,而不管您是否已經在應用程式中的其他某個位置為模板類指定了該型別。C++ 連結器負責解決該問題,並且並不總是有效。這可能會導致程式碼膨脹,從而增加載入時間和記憶體足跡。

【一些泛型應用】

  

相關推薦

面試題 - 使用Java注意什麼

     1、不能使用基本資料型別如int,而是使用Integer等包裝型別;         2、<T>這種,T是要使用大寫的T,而不能使用小寫   3、泛型類不可以繼承Ex

1.為什麼

泛型程式設計(Generic programming) 意味著編寫的程式碼可以被很多不同型別的物件所重用 在增加泛型類之前,ArrayList類只維護一個Object引用的陣列: public class ArrayList { pr

為什麼使用有什麼優勢?

為什麼要用泛型呢?博主覺得泛型的主要優勢有以下幾點:(1)保證了型別的安全性:泛型約束了變數的型別,保證了型別的安全性。例如List<int>和ArrayList。List<int>集合只能加入int型別的變數,ArrayList可以Add任何常用型別

什麼是?為什麼使用

我們在編寫程式時,經常遇到兩個模組的功能非常相似,只是一個是處理int型別資料,另一個處理String型別資料,或者其 他自定義型別資料,但是我們沒有辦法,只能分別寫多個方法處理每種資料型別,因為方法的引數型別不同。那有一種方法, 在方法中傳入通用的資料型別,就可以用

Java中為什麼使用

       泛型(Generic type 或者 generics)是對 Java 語言的型別系統的一種擴充套件,以支援建立可以按型別進行引數化的類。可以把型別引數看作是使用引數化型別時指定的型別的一個佔位符,就像方法的形式引數是執行時傳遞的值的佔位符一樣。         可以在集合框架(Colle

我們為什麼使用程式設計?誰想成為程式設計師?

前言:泛型正是我們需要的,使用泛型機制編寫的程式程式碼要比那些雜亂地使用Object變數,然後再進行強制型別轉換的程式碼具有更好的安全性和可讀性。泛型對於集合類尤為有用,例如,ArrayList就是一個無處不在的集合類。 泛型程式設計(Generic programming

封裝設定屬性,一家人都整整齊齊系列(1) JAVA的實現原理

1.基本學過JAVA的人都知道一點泛型,明白常出現的位置和大概怎麼使用。在類上為:class 類名<T> {}  在方法上為:public <T> void 方法名 (T x){}就不再贅述了。  2.泛型就是將型別變成了引數去傳入,使得可以使用的型別

為什麼使用

【為什麼要使用泛型】   通過泛型可以定義型別安全的資料結構(型別安全),而無須使用實際的資料型別(可擴充套件)。這能夠顯著提高

Mooc軟件工程-02面向對象

組成 ima 固然是 name 成員 專註 對象 指示 類的繼承 1 內聚   模塊     語義上連續的一系列語句, 由邊界符界定, 並且有一個聚集標識符   常見的模塊     在面向對象中的 類, 方法     在面向過程的 函數   模塊功能單一, 內部

集合的使用

column func prot 技術分享 empty 創建 sha 循環 sdn 對於機房收費系統的重構。從大的方面來看。無非就是對於數據庫的四個操作。增刪改查。而且我們用的是三層架構進行重構。D層用來和數據庫打交道。進行這四個操作就須要有返回值,增刪改在這裏

Java擦除

類型信息 png ive over tool 創建 edit sid 註意點 Java泛型擦除: 什麽是泛型擦除? 首先了解一下什麽是泛型?我個人的理解:因為集合中能夠存儲隨意類型的對象。可是集合中最先存儲的對象類型一旦確定後,就不能在存儲其它類型的

的基本定義及使用

turn test 出現 span color nts extend 參數類型 子類                                     泛型 1、 基本概念: 範例: class Point<T>{//T的類型未知 T x; T y; P

的一些基本認知

bject jdk1 認知 左右 list 多態 arr object 數據 泛型是jdk1.5使用的新特性。 泛型的好處: 1. 將運行時的異常提前至了編譯時。 2. 避免了無謂的強制類型轉換 。 泛型在集合中的常見應用: ArrayLis

接口

code style cnblogs dem 不明確 nts add ring pub 1 泛型接口的定義格式:   interface 接口名<聲明自定義泛型>{   } 2 泛型接口要註意的事項:   A. 接口上自定義的泛型的具體數據類型是在

C# 的簡單講解和應用

出現 ava 問題 this bsp div arc 但是 int 泛型 什麽是泛型   泛型是 2.0 版 C# 語言和公共語言運行庫 (CLR) 中的一個新功能。泛型將類型參數的概念引入 .NET Framework,類型參數使得設計如下類和方法成為可能:這些類和方

Java學習筆記——

ray dem 想想 string stub odt 好處 reac test 一、什麽是泛型?為什麽要使用泛型? 且看代碼: 1 public class GenericsDemo { 2 3 public static void main(String

what are you 弄啥嘞!!!!!!!!!!!!!!!!

版本 exceptio 文章 泛型的使用 cat emp 轉換 cep 都是 1.為什麽需要泛型 泛型在Java中有很重要的地位,網上很多文章羅列各種理論,不便於理解,本篇將立足於代碼介紹、總結了關於泛型的知識。希望能給你帶來一些幫助。 先看下面的代碼: List l

的使用

null arraylist exce top ext extend 實例 泛型方法 arr ?? 泛型的使用 * 1.在集合中使用泛型(掌握) * 2.自己定義泛型類、泛型接口、泛型方法(理解 --->使用) * 3.泛型與繼承的關系 * 4.通配符

數組

print port win ring void res block ray new t 前言:大家都知道要定義如“T[]t = new T[10];”這樣的泛型數組是不行的,自己也找了不少方法。最後在《Thinking InJava》中吸取了一種非常好的方法。如今分享

java的

args 關系 返回 不同的 bject span string 接口 static   java集合   Java集合有一個缺點,就是把一個對象“丟進”集合裏後,集合就會“忘記”這個對象的數據類型,當再次取出該對象時,該對象的編譯類型就變成了Object類型(其運行時類型