015_泛型概念
1. 泛型的概念
1.1. 泛型的定義: 泛型就是參數化類型。
1.2. 泛型是JDK 1.5的一項新特性, 它的本質是參數化類型(Parameterized Type)的應用, 也就是說所操作的數據類型被指定為一個參數, 在用到的時候在指定具體的類型。
2. 參數化類型
2.1. 參數可以簡單分為: 形參, 實參, 類型形參, 類型實參。
2.2. 參數, 最熟悉的就是定義方法時有形參, 然后調用此方法時傳遞實參。
2.3. 參數化類型就是將原來的具體的類型參數化, 類似于方法中的變量參數,此時類型也定義成參數形式(可以稱之為類型形參), 然后在使用/調用時傳入具體的類型(類型實參)。
2.4. 參數類型可以用在類、接口和方法的定義中,分別稱為泛型類、泛型接口和泛型方法。
3. 為什么會出現泛型
3.1. 泛型思想早在C++語言的模板(Templates)中就開始生根發芽, 在Java語言處于還沒有出現泛型的版本時, 只能通過Object是所有類型的父類和類型強制轉換兩個特點的配合來實現類型泛化。例如在哈希表的存取中, JDK 1.5之前使用HashMap的get()方法, 返回值就是一個Object對象, 由于Java語言里面所有的類型都繼承于java.lang.Object, 那Object轉型為任何對象成都是有可能的。但是也因為有無限的可能性, 就只有程序員和運行期的虛擬機才知道這個Object到底是個什么類型的對象。在編譯期間, 編譯器無法檢查這個Object的強制轉型是否成功, 如果僅僅依賴程序員去保障這項操作的正確性,許多ClassCastException的風險就會被轉嫁到程序運行期之中。
4. 真實泛型
泛型技術在C#和Java之中的使用方式看似相同,但實現上卻有著根本性的分歧,C#里面泛型無論在程序源碼中、編譯后的IL中(Intermediate Language, 中間語言, 這時候泛型是一個占位符)或是運行期的CLR中都是切實存在的, List與List就是兩個不同的類型(泛型占位符可能是不一樣的), 它們在系統運行期生成, 有自己的虛方法表和類型數據,這種實現稱為類型膨脹,基于這種方法實現的泛型被稱為真實泛型。
5. 偽泛型
5.1.?java語言中的泛型則不一樣,它只在程序源碼中存在,在編譯后的字節碼文件中,就已經被替換為原來的原始類型(Raw Type,也稱為裸類型)了, 并且在相應的地方插入了強制轉型代碼,因此對于運行期的java語言來說,ArrayList與ArrayList就是同一個類型(運行時已經是原始類型, 所以是同一類型)。所以說泛型技術實際上是java語言的一顆語法糖,java語言中的泛型實現方法稱為類型擦除,基于這種方法實現的泛型被稱為偽泛型。
5.2.?泛型確實是在編譯階段起作用,在生成的class文件中就沒有了泛型信息,但是運行時是怎么找到原本的類型信息的呢? 其實還是強制類型轉換,編譯器將之前用到從泛型對象的地方自動添加了強制類型轉換。
6. Java泛型的作用
6.1. 減少運行時期的類型轉換異常, 增加編譯的時候對類型的檢查, 具有更好的安全性和易讀性。
6.2. 泛型程序設計(Generic Programming)意味著編寫的代碼可以被很多不同類型的對象所重用。
總結
- 上一篇: 004_Mysql数据库的CRUD的操作
- 下一篇: 016_泛型常见通配符