從一知半解到揭曉Java高階語法—泛型
阿新 • • 發佈:2020-09-10
[TOC]
## 前言
泛型是Java基礎知識的重點,雖然我們在初學Java的時候,都學過泛型,覺得自己掌握對於Java泛型的使用(全是錯覺),往後的日子,當我們深入去閱讀一些框架原始碼,你就發現了,自己會的只是簡單的使用,卻看不懂別人的泛型程式碼是怎麼寫的,還可以這樣,沒錯,別人寫出來的程式碼那叫藝術,而我......
### 探討
`Java`語言為什麼存在著泛型,而像一些動態語言`Python`,`JavaScipt`卻沒有泛型的概念?
原因是,像`Java`,`C#`這樣的靜態編譯型的語言,它們在傳遞引數的時候,引數的型別,必須是明確的,看一個例子,簡單編寫一個存放`int`型別的棧—`StackInt`,程式碼如下:
```java
public class StackInt {
private int maxSize;
private int[] items;
private int top;
public StackInt(int maxSize){
this.maxSize = maxSize;
this.items = new int[maxSize];
this.top = -1;
}
public boolean isFull(){
return this.top == this.maxSize-1;
}
public boolean isNull(){
return this.top <= -1;
}
public boolean push(int value){
if(this.isFull()){
return false;
}
this.items[++this.top] = value;
return true;
}
public int pop(){
if(this.isNull()){
throw new RuntimeException("當前棧中無資料");
}
int value = this.items[top];
--top;
return value;
}
}
```
在這裡使用建構函式初始化一個`StackInt`物件時,可以傳入`String`字串嗎?很明顯是不行的,我們要求的是`int`型別,傳入字串`String`型別,這樣在語法檢查階段時會報錯的,像`Java`這樣的靜態編譯型的語言,引數的型別要求是明確的
![在這裡插入圖片描述](//p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e7d29118a7144b559aedc3ec64eeaa8e~tplv-k3u1fbpfcp-zoom-1.image)
### 泛型解決了什麼問題?
**引數不安全**:引入泛型,能夠在編譯階段找出程式碼的問題,而不是在執行階段
泛型要求在宣告時指定實際資料型別,`Java 編譯器`在編譯時會對泛型程式碼做強型別檢查,並在程式碼違反型別安全時發出告警。早發現,早治理,把隱患扼殺於搖籃,在編譯時發現並修復錯誤所付出的代價遠比在執行時小。
**避免型別轉換:**
未使用泛型:
```java
List list = new ArrayList();
list.add("hello");
String s = (String) list.get(0); //需要在取出Value的時候進行強制轉換
```
使用泛型:
```java
List