在前面的學習中,使用了大量的這樣的語句,比如:`List<Teacher>`,`Array<Teacher>`,`HTMLCollectionOf<HTMLOptionElement>`,如果你學習過JAVA對此應該并不陌生,這種`<>`的用法被稱之為泛型。泛型譯之于英文的`generic`,意為一般的、通用的、廣泛的。大體就是說這個東西隨我們的意愿,我們想讓它是什么,它就是是什么。
在實際的使用中,泛型常常被用于一些像`容器`的一樣的類型中。比如我們使用的最廣泛的`List<T>`,`Array<T>`,無論是列表還是數組都是一個容器,該容器能夠裝入任何類型的數據,所以用泛型來`<T>`來對該容器進行標識。
這就像現實生活中3只相同玻璃杯:第一只玻璃杯第一次被倒入了水,從此它有了個新名字叫水杯;第二只玻璃杯第一次被倒入了酒,從此它有了個新名字叫酒杯;第三只玻璃杯第一次被倒入了花生油,從此它有了一個新名字叫油壺。由此看來玻璃杯是多用途的,在程序中把這種擁有各種裝載給力的窗口稱為泛型容器;用代碼來表示上述三只玻璃杯:`水杯 = 玻璃杯<水>`,`酒杯 = 玻璃杯<酒>`, `油壺 = 玻璃杯<油>`。
在計算機的世界中,這個玻璃杯大概長這個樣子:
```java
class 玻璃杯<T?> {
T 存放的物質; ?
void 裝入<裝入的物質: T?> {
this.存放的物質 = 裝入的物質;
}
T? 取出() {
return this.存放的物質;
}
}
```
* ? 【規定】該玻璃杯裝啥都行;你規定裝啥,咱就裝啥。
* ? 【實際的存放地】你規定裝啥,我就能存啥。
* ? 【存數據】你說裝啥,那裝的時候就必須是啥。
* ? 【取數據】你說裝啥,那么取的時候就必然是啥。
當我們想用其裝水時,我們需要用如下代碼:
```
玻璃杯<水> a = new 玻璃杯<水>();
```
此時,我們便得到了一個規定好的用于裝水且只能裝水的玻璃杯a。
```
a.裝入(水);
```
規定了a裝的是水,那么a就能裝水,具只能裝水。a裝的水被存在了內部的?中。
```
水 b = a.取出();
```
規定a裝的是水,那么從a中取出來的也必然是水。
## 多泛型
現實生活中除了家里的玻璃杯是多用途的以外,火鍋店的`鍋`也是典型的多用途容器。我們到了火鍋店,你點清湯鍋底那么倒入該`鍋`里便是清湯,我們從中盛出的當然也會是清湯;你點麻辣鍋底,該`鍋`中便會是麻辣味道的湯。除此以外,還有一種`鍋`叫做鴛鴦鍋的,通過泛型來描述它的代碼如下:
```
class 鴛鴦鍋<T?, D?> {
T 左側鍋裝的湯;
D 右側鍋裝的湯;
void 裝入<裝入左側鍋的湯: T, 裝入右側鍋的湯 D> { ?
this.左側鍋裝的湯 = 裝入左側鍋的湯;
this.右側鍋裝的湯 = 裝入右側鍋的湯;
}
void 裝入<裝入左側鍋的湯: T> { ?
this.左側鍋裝的湯 = 裝入左側鍋的湯;
}
void 裝入<裝入右側鍋的湯 D> { ?
this.右側鍋裝的湯 = 裝入右側鍋的湯;
}
T 取出左側鍋裝的湯() { ?
return this.左側鍋裝的湯;
}
D 取出右側鍋裝的湯() { ?
return this.右側鍋裝的湯;
}
}
```
* ?? 分別對內部的兩個容器中的類型做約束
* ? 可以使用一個方法一起裝入
* ? 也可以按類型分子容器裝入
* ? 每個子容器裝的是時候,獲取的時候便也會是什么。
## 總結
好了,到了總結的時候了。根據上面的一此代碼我們猜測:
* [ ] 當某個類具有`容器`性質的時候,可以使用泛型來聲明。
* [ ] 在使用`容器`時,一旦設置`容器`中物質的具體類型。則該容器的后續操作,便被約束于該具體類型。
* [ ] 在具體裝載數據以前它是寬泛的,而一旦聲明裝載數據的類型,便馬上變得特定了
* [ ] `容器`中還可以有`子容器`,當容器可以裝載多種物質時,需要對各種物質的類型分別進行約束。
筆者認為:泛型是對容器裝載數據的一種約束,它即寬泛又特定。它的寬泛在于可以裝載任何的類型,它的特定在于一旦指定了裝置某種類型后后續的操作便只能針對此類型。
- 序言
- 第一章:Hello World
- 第一節:Angular準備工作
- 1 Node.js
- 2 npm
- 3 WebStorm
- 第二節:Hello Angular
- 第三節:Spring Boot準備工作
- 1 JDK
- 2 MAVEN
- 3 IDEA
- 第四節:Hello Spring Boot
- 1 Spring Initializr
- 2 Hello Spring Boot!
- 3 maven國內源配置
- 4 package與import
- 第五節:Hello Spring Boot + Angular
- 1 依賴注入【前】
- 2 HttpClient獲取數據【前】
- 3 數據綁定【前】
- 4 回調函數【選學】
- 第二章 教師管理
- 第一節 數據庫初始化
- 第二節 CRUD之R查數據
- 1 原型初始化【前】
- 2 連接數據庫【后】
- 3 使用JDBC讀取數據【后】
- 4 前后臺對接
- 5 ng-if【前】
- 6 日期管道【前】
- 第三節 CRUD之C增數據
- 1 新建組件并映射路由【前】
- 2 模板驅動表單【前】
- 3 httpClient post請求【前】
- 4 保存數據【后】
- 5 組件間調用【前】
- 第四節 CRUD之U改數據
- 1 路由參數【前】
- 2 請求映射【后】
- 3 前后臺對接【前】
- 4 更新數據【前】
- 5 更新某個教師【后】
- 6 路由器鏈接【前】
- 7 觀察者模式【前】
- 第五節 CRUD之D刪數據
- 1 綁定到用戶輸入事件【前】
- 2 刪除某個教師【后】
- 第六節 代碼重構
- 1 文件夾化【前】
- 2 優化交互體驗【前】
- 3 相對與絕對地址【前】
- 第三章 班級管理
- 第一節 JPA初始化數據表
- 第二節 班級列表
- 1 新建模塊【前】
- 2 初識單元測試【前】
- 3 初始化原型【前】
- 4 面向對象【前】
- 5 測試HTTP請求【前】
- 6 測試INPUT【前】
- 7 測試BUTTON【前】
- 8 @RequestParam【后】
- 9 Repository【后】
- 10 前后臺對接【前】
- 第三節 新增班級
- 1 初始化【前】
- 2 響應式表單【前】
- 3 測試POST請求【前】
- 4 JPA插入數據【后】
- 5 單元測試【后】
- 6 惰性加載【前】
- 7 對接【前】
- 第四節 編輯班級
- 1 FormGroup【前】
- 2 x、[x]、{{x}}與(x)【前】
- 3 模擬路由服務【前】
- 4 測試間諜spy【前】
- 5 使用JPA更新數據【后】
- 6 分層開發【后】
- 7 前后臺對接
- 8 深入imports【前】
- 9 深入exports【前】
- 第五節 選擇教師組件
- 1 初始化【前】
- 2 動態數據綁定【前】
- 3 初識泛型
- 4 @Output()【前】
- 5 @Input()【前】
- 6 再識單元測試【前】
- 7 其它問題
- 第六節 刪除班級
- 1 TDD【前】
- 2 TDD【后】
- 3 前后臺對接
- 第四章 學生管理
- 第一節 引入Bootstrap【前】
- 第二節 NAV導航組件【前】
- 1 初始化
- 2 Bootstrap格式化
- 3 RouterLinkActive
- 第三節 footer組件【前】
- 第四節 歡迎界面【前】
- 第五節 新增學生
- 1 初始化【前】
- 2 選擇班級組件【前】
- 3 復用選擇組件【前】
- 4 完善功能【前】
- 5 MVC【前】
- 6 非NULL校驗【后】
- 7 唯一性校驗【后】
- 8 @PrePersist【后】
- 9 CM層開發【后】
- 10 集成測試
- 第六節 學生列表
- 1 分頁【后】
- 2 HashMap與LinkedHashMap
- 3 初識綜合查詢【后】
- 4 綜合查詢進階【后】
- 5 小試綜合查詢【后】
- 6 初始化【前】
- 7 M層【前】
- 8 單元測試與分頁【前】
- 9 單選與多選【前】
- 10 集成測試
- 第七節 編輯學生
- 1 初始化【前】
- 2 嵌套組件測試【前】
- 3 功能開發【前】
- 4 JsonPath【后】
- 5 spyOn【后】
- 6 集成測試
- 7 @Input 異步傳值【前】
- 8 值傳遞與引入傳遞
- 9 @PreUpdate【后】
- 10 表單驗證【前】
- 第八節 刪除學生
- 1 CSS選擇器【前】
- 2 confirm【前】
- 3 功能開發與測試【后】
- 4 集成測試
- 5 定制提示框【前】
- 6 引入圖標庫【前】
- 第九節 集成測試
- 第五章 登錄與注銷
- 第一節:普通登錄
- 1 原型【前】
- 2 功能設計【前】
- 3 功能設計【后】
- 4 應用登錄組件【前】
- 5 注銷【前】
- 6 保留登錄狀態【前】
- 第二節:你是誰
- 1 過濾器【后】
- 2 令牌機制【后】
- 3 裝飾器模式【后】
- 4 攔截器【前】
- 5 RxJS操作符【前】
- 6 用戶登錄與注銷【后】
- 7 個人中心【前】
- 8 攔截器【后】
- 9 集成測試
- 10 單例模式
- 第六章 課程管理
- 第一節 新增課程
- 1 初始化【前】
- 2 嵌套組件測試【前】
- 3 async管道【前】
- 4 優雅的測試【前】
- 5 功能開發【前】
- 6 實體監聽器【后】
- 7 @ManyToMany【后】
- 8 集成測試【前】
- 9 異步驗證器【前】
- 10 詳解CORS【前】
- 第二節 課程列表
- 第三節 果斷
- 1 初始化【前】
- 2 分頁組件【前】
- 2 分頁組件【前】
- 3 綜合查詢【前】
- 4 綜合查詢【后】
- 4 綜合查詢【后】
- 第節 班級列表
- 第節 教師列表
- 第節 編輯課程
- TODO返回機制【前】
- 4 彈出框組件【前】
- 5 多路由出口【前】
- 第節 刪除課程
- 第七章 權限管理
- 第一節 AOP
- 總結
- 開發規范
- 備用