1. 程式人生 > >從一知半解到揭曉Java高階語法—泛型

從一知半解到揭曉Java高階語法—泛型

[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