第6章 泛型

2022-01-15 19:17:28 字數 1316 閱讀 5911

泛型可以建立獨立於被包含型別的類和方法

效能、型別的安全性、二進位制**重用、**的拓展、命名約定

6.1.1 效能

var list = new

arraylist();

list.add(

4); //

裝箱int il = (int) list [0]; //

拆箱var list = new list();

list.add(

44); //

不用裝箱

int il = list[0]; //

不用拆箱

arraylist類儲存物件,把物件作為引數,需要大量裝箱和拆箱。

list類不使用物件,而是在使用時定義型別,定義的型別在jit編譯器動態生成的類中使用,不再進行裝箱和拆箱操作

6.1.2 型別安全

arraylist可以add任意型別,foreach遍歷int型別時遇到不是int就會異常。

list泛型型別t定義了允許使用的型別

6.1.3 二進位制**的重用

泛型型別可以定義一次,可以用許多不用的型別例項化

var list = new list();

var stringlist = new list();

var myclasslist = new list();

6.1.4 **的拓展

在不同的特定型別例項化泛型時,會建立多少**?因為泛型類的定義會放在程式集中,所以用特定型別例項化泛型類不會在il**中賦值這些類。但是,在jit編譯器把泛型類編譯為本地**時,會給每個值型別建立乙個新類。引用型別共享同乙個本地類的所有相同的實現**。這是因為引用型別在例項化的泛型類中只需要4個位元組的記憶體位址(32位系統),就可以引用乙個引用型別。值型別包含在例項化的泛型類的記憶體中,同時因為每個值型別對記憶體的要求都不通,所以要為每個值型別例項化乙個新類。

(看不懂)

6.1.5 命名約定

泛型型別的名稱用字母t作為字首 public

class list()

如果沒有特殊的要求,泛型型別允許用任意類替代,且只使用了乙個泛型型別,就可以用字元t作為泛型型別的名稱 public

class linkedlist

如果泛型型別有特定的要求(例如,它必須實現乙個介面或派生自基類,或者使用了兩個或多個泛型型別),就應該給泛型型別使用描述性的名稱

public

class sortedlist()

6.2 建立泛型類

每個處理物件型別的類都可以有泛型實現方式,這樣有利於消除型別強制轉換操作

6.3 泛型類的功能

第9章 泛型

增加了泛型支援後的集合,完全可以記住集合中元素的型別,並可以在編譯時檢查集合中元素的型別,如果試圖向集合中新增不滿足型別要求的物件,編譯器就會提示錯誤。建立的方法是 在集合介面 類後增加尖括號,尖括號裡放乙個資料型別,如 liststr new arraylist 對於後面的 系統會自動識別為str...

第12章 泛型

泛型字母 形式型別引數 formal type parameters 即泛型字母 命名 泛型字母可以隨意指定,盡量使用單個的大寫字母 有時候多個泛型型別時會加上數字,比如t1,t2 常見字母 見名知意 t type k v key value e element 需求 定義學生類,其中有學生成績 整...

第12章 泛型

publicstaticvoidmain string args 1 泛型沒有多型 如果b是a的乙個子型別 子類或者子介面 而g是具有泛型宣告的類或介面,g並不是g的子型別!比如 string是object的子類,但是list並不是list的子類。2 沒有泛型陣列 public class test...