Java?泛型超詳細(xì)入門講解
1、什么是泛型?
泛型其實(shí)就是將類型作為參數(shù)傳遞,泛型允許程序員在編寫代碼時(shí)使用一些以后才指定的類型 ,在實(shí)例化該類時(shí)將想要的類型作為參數(shù)傳遞,來指明這些類型。
為什么要引入泛型?
例如:自己實(shí)現(xiàn)一個(gè)順序表
public class MyArrayList { public int[] elem; public int usedSize; public MyArrayList() { this.elem = new int[10]; } // add方法 public void add(int val) { // 暫時(shí)不考慮擴(kuò)容問題,這里只是為了講泛型 elem[usedSize++] = val; } // get方法 public int get(int pos) { return elem[pos]; } }
這里可以看出,在使用上面這個(gè)自定義的順序表時(shí),我們只能添加 int 類型的元素,我們知道java集合中的順序表,可以添加任何類型的數(shù)據(jù),怎么實(shí)現(xiàn)的呢?這里我們先嘗試將 int 類型變?yōu)镺bject類型,這樣就可以保證能傳入任何類型。
public class MyArrayList { public Object[] elem; public int usedSize; public MyArrayList() { this.elem = new Object[10]; } // add方法 public void add(Object val) { // 暫時(shí)不考慮擴(kuò)容問題,這里只是為了講泛型 elem[usedSize++] = val; } // get方法 public Object get(int pos) { return elem[pos]; } }
main方法中往對(duì)象中添加數(shù)據(jù)時(shí),可以添加任意類型的數(shù)據(jù)。但是,當(dāng)需要取出數(shù)據(jù)時(shí),因?yàn)榉祷氐氖荗bject類型,需要進(jìn)行強(qiáng)轉(zhuǎn)才能用相對(duì)應(yīng)的類型來接收,非常麻煩。
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); }
所以問題來了,難道每次都要強(qiáng)轉(zhuǎn)一下才能接收嗎,能否不強(qiáng)轉(zhuǎn)呢?這時(shí)候我們就想到在創(chuàng)建一個(gè)實(shí)例對(duì)象時(shí),可以將想要的類型作為參數(shù)傳遞,讓這個(gè)對(duì)象中全部存?zhèn)魅氲念愋偷臄?shù)據(jù),那么拿出來的時(shí)候,就可以明確該對(duì)象中所有的數(shù)據(jù)都是該類型,不需要強(qiáng)轉(zhuǎn)了。這就引入了泛型。
public class MyArrayList<E> { // 在編寫程序時(shí),不指定具體的類型,而用<E>這里的E來暫時(shí)代替 // 具體的類型在實(shí)例化對(duì)象時(shí)傳入 public E[] elem; public int usedSize; public MyArrayList() { // 這里的寫法不是特別準(zhǔn)確,應(yīng)該用反射機(jī)制,這里先這樣寫 this.elem = (E[])new Object[10]; } // add方法 public void add(E val) { // 暫時(shí)不考慮擴(kuò)容問題,這里只是為了講泛型 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");// 這里會(huì)報(bào)錯(cuò),因?yàn)閭魅氲臄?shù)據(jù)不是指定的類型,所以泛型還有自動(dòng)對(duì)類型進(jìn)行檢查的作用 int I1 = myArrayList1.get(0); MyArrayList<String> myArrayList2 = new MyArrayList<>(); myArrayList2.add("hello"); myArrayList2.add("world"); String s1 = myArrayList2.get(0); }
這樣就保證了能傳入任何類型的數(shù)據(jù),同時(shí)在拿出時(shí)也不需要強(qiáng)轉(zhuǎn)!
泛型的意義:
1、自動(dòng)對(duì)類型進(jìn)行檢查
2、自動(dòng)對(duì)類型進(jìn)行強(qiáng)制類型轉(zhuǎn)換
那么這里MyArrayList對(duì)應(yīng)對(duì)象的類型是什么呢?是MyArrayList< Integer > 之類的嗎?
這里可以看出,實(shí)例創(chuàng)建的對(duì)象他的類型都是MyArrayList,而<>中的內(nèi)容不參與泛型類型的組成,那么<>里面的類型哪里去了呢?這就要了解泛型的工作機(jī)制了。
2、泛型是怎么編譯的
數(shù)組和泛型之間的一個(gè)重要區(qū)別是它們?nèi)绾螐?qiáng)制類型檢查。具體來說,數(shù)組在運(yùn)行時(shí)存儲(chǔ)和檢查類型信息。但是,泛型在編譯時(shí)檢查類型錯(cuò)誤,并且在運(yùn)行時(shí)沒有類型信息。
泛型的編譯機(jī)制:擦除機(jī)制
在編譯時(shí),將 MyArrayList 中的 E 擦成了 Object 類型。
在main方法中都擦成了 MyArrayList 類型。
到此這篇關(guān)于Java 泛型超詳細(xì)入門講解的文章就介紹到這了,更多相關(guān)Java 泛型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)調(diào)用對(duì)方http接口得到返回?cái)?shù)據(jù)
這篇文章主要介紹了Java實(shí)現(xiàn)調(diào)用對(duì)方http接口得到返回?cái)?shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09利用ScriptEngineManager實(shí)現(xiàn)字符串公式靈活計(jì)算的方法
今天小編就為大家分享一篇利用ScriptEngineManager實(shí)現(xiàn)字符串公式靈活計(jì)算的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07java返回json請(qǐng)求中文變成問號(hào)的問題及解決
這篇文章主要介紹了java返回json請(qǐng)求中文變成問號(hào)的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07如何使用RequestHeaders添加自定義參數(shù)
這篇文章主要介紹了使用RequestHeaders添加自定義參數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2022-02-02java 查找list中重復(fù)數(shù)據(jù)實(shí)例詳解
這篇文章主要介紹了java 查找list中重復(fù)數(shù)據(jù)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-01-01關(guān)于Java中static關(guān)鍵字的用法
這篇文章主要介紹了關(guān)于Java中static關(guān)鍵字的用法,static:意為靜態(tài)的,在?Java?里面作為靜態(tài)修飾符,可以理解為全局的意思,static?不僅可以修飾成員變量,成員方法,還可以修飾代碼塊,需要的朋友可以參考下2023-08-08Mybatis傳參為逗號(hào)分隔的字符串情形進(jìn)行in條件查詢方式
這篇文章主要介紹了Mybatis傳參為逗號(hào)分隔的字符串情形進(jìn)行in條件查詢方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01