1、什麼是泛型?
泛型其實就是將類型作為參數傳遞,泛型允許程式設計師在編寫程式碼時使用一些以後才指定的類型,在實例化該類別時將想要的類型作為參數傳遞,來指明這些類型。
為什麼要引入泛型?
例如:自己實作一個順序表
public class MyArrayList { public int[] elem; public int usedSize; public MyArrayList() { this.elem = new int[10]; } // add方法 public void add(int val) { // 暂时不考虑扩容问题,这里只是为了讲泛型 elem[usedSize++] = val; } // get方法 public int get(int pos) { return elem[pos]; } }
這裡可以看出,在使用上面這個自訂的順序表時,我們只能加入int 類型的元素,我們知道java集合中的順序表,可以新增任何類型的數據,怎麼實現的呢?這裡我們先嘗試將 int 類型變成Object型,這樣就可以保證能傳入任何型別。
public class MyArrayList { public Object[] elem; public int usedSize; public MyArrayList() { this.elem = new Object[10]; } // add方法 public void add(Object val) { // 暂时不考虑扩容问题,这里只是为了讲泛型 elem[usedSize++] = val; } // get方法 public Object get(int pos) { return elem[pos]; } }
main方法中往物件中新增資料時,可以新增任意類型的資料。但是,當需要取出資料時,因為傳回的是Object類型,需要強轉才能用相對應的類型來接收,非常麻煩。
public static void main(String[] args) { MyArrayList myArrayList = new MyArrayList(); myArrayList.add(1); myArrayList.add("hello"); int array1 = (int)myArrayList.get(0); String array2 = (String)myArrayList.get(1); }
所以問題來了,難道每次都要強轉一下才能接收嗎,能否不強轉呢?這時候我們就想到在創建一個實例物件時,可以將想要的類型作為參數傳遞,讓這個物件中全部存傳入的類型的數據,那麼拿出來的時候,就可以明確該物件中所有的數據都是該類型,不需要強轉了。這就引入了泛型。
public class MyArrayList<E> { // 在编写程序时,不指定具体的类型,而用<E>这里的E来暂时代替 // 具体的类型在实例化对象时传入 public E[] elem; public int usedSize; public MyArrayList() { // 这里的写法不是特别准确,应该用反射机制,这里先这样写 this.elem = (E[])new Object[10]; } // add方法 public void add(E val) { // 暂时不考虑扩容问题,这里只是为了讲泛型 elem[usedSize++] = val; } // get方法 public E get(int pos) { return elem[pos]; } }
public static void main(String[] args) { MyArrayList<Integer> myArrayList1 = new MyArrayList<>(); myArrayList1.add(1); myArrayList1.add(3); // myArrayList1.add("world");// 这里会报错,因为传入的数据不是指定的类型,所以泛型还有自动对类型进行检查的作用 int I1 = myArrayList1.get(0); MyArrayList<String> myArrayList2 = new MyArrayList<>(); myArrayList2.add("hello"); myArrayList2.add("world"); String s1 = myArrayList2.get(0); }
這樣就保證了能傳入任何類型的數據,同時在拿出時也不需要強轉!泛型的意義:
1、自動對型別檢查
2、自動對型別強制型別轉換
那麼這裡MyArrayList對應物件的型別是什麼呢?是MyArrayList 之類的嗎?
這裡可以看出,實例所建立的物件他的型別都是MyArrayList,而中的內容不參與泛型類型的組成,那麼裡面的類型哪裡去了呢?這就要了解泛型的工作機制了。
2、泛型是怎麼編譯的
陣列和泛型之間的一個重要區別是它們如何強制類型檢查。具體來說,數組在運行時儲存和檢查類型資訊。但是,泛型在編譯時檢查類型錯誤,並且在執行時間沒有類型資訊。
泛型的編譯機制:擦除機制
在編譯時,將 MyArrayList 中的 E 擦成了 Object 類型。
在main方法中都擦成了 MyArrayList 類型。
以上是Java泛型使用入門實例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

記事本++7.3.1
好用且免費的程式碼編輯器

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

SublimeText3 Linux新版
SublimeText3 Linux最新版