Java:泛型知識(shí)知多少
定義
可理解為 適配廣泛的類型,即參數(shù)化類型,可以把類型像方法的參數(shù)那樣進(jìn)行傳遞。
// 以ArrayList為示例 // 泛型T可以是任意類 public class ArrayList<T> { private T[] array; //... } // 通過(guò)泛型的使用,就可創(chuàng)建多種類型的ArrayList // 1. 可存儲(chǔ)String的ArrayList: ArrayList<String> strList = new ArrayList<String>(); // 相當(dāng)于 public class ArrayList<String> { private String[] array; //... } // 2. 可存儲(chǔ)Float的ArrayList: ArrayList<Float> floatList = new ArrayList<Float>(); // 相當(dāng)于 public class ArrayList<Float> { private Float[] array; //... }
意義(即為什么要使用泛型)
通過(guò)定義一種模板方式結(jié)構(gòu),從而保證類型安全 & 匹配。下面將用ArrayList為示例作為說(shuō)明。
1. 背景
ArrayList的本質(zhì):一個(gè)可變的Object類型數(shù)組
public class ArrayList { private Object[] array; // ... }
2. 問題
在使用ArrayList存儲(chǔ)不同類型時(shí),需要強(qiáng)轉(zhuǎn)類型,不然容易出現(xiàn)ClassCastException異常。如存儲(chǔ)String類型:
// 獲取到ArrayList里的Object類型時(shí),必須強(qiáng)制轉(zhuǎn)型為String // 不然容易出現(xiàn)ClassCastException異常 ArrayList list = new ArrayList(); list.add("carson ho"); String first = (String) list.get(0);
3. 解決方案
使用泛型將ArrayList變成一種模板:ArrayList,就可以創(chuàng)建任意類型的ArrayList。即:
// 泛型T可以是任意類 public class ArrayList<T> { private T[] array; //... } // 多種類型 // 1. 可存儲(chǔ)String的ArrayList: ArrayList<String> strList = new ArrayList<String>(); // 相當(dāng)于 public class ArrayList<String> { private String[] array; //... } // 2. 可存儲(chǔ)Float的ArrayList: ArrayList<Float> floatList = new ArrayList<Float>(); // 相當(dāng)于 public class ArrayList<Float> { private Float[] array; //... }
作用
1.使編譯器可在編譯期間對(duì)類型進(jìn)行檢查以提高類型安全,減少運(yùn)行時(shí)由于對(duì)象類型不匹配引發(fā)的異常;
2.運(yùn)行時(shí)所有的轉(zhuǎn)換都是強(qiáng)制、隱式的,大大提高了代碼的重用率。如對(duì)集合類取數(shù)據(jù)時(shí),不需 對(duì)存儲(chǔ)的數(shù)據(jù) 進(jìn)行強(qiáng)制類型轉(zhuǎn)2換。
原理
基于 類型擦除。即即 使用泛型時(shí)加上的類型參數(shù),會(huì)在編譯器在編譯時(shí)去掉所以,在生成的 Java 字節(jié)碼中,不包含泛型中的類型信息。這里需要特別說(shuō)明的是:
- Java中的泛型是在編譯器層次實(shí)現(xiàn),編譯器在編譯時(shí)盡可能的發(fā)現(xiàn)可能出錯(cuò)的地方,但仍無(wú)法避免在運(yùn)行時(shí)刻出現(xiàn)類型轉(zhuǎn)換異常的情況;
- 在代碼中定義的List 、List等類型,在編譯后都會(huì)變成List
- JVM看到的只是List,而由泛型附加的類型信息對(duì)JVM來(lái)說(shuō)是不可見的
同時(shí)需要特別注意的是:
- 在無(wú)泛型的情況下,通常是使用Object類型來(lái)進(jìn)行多種類型數(shù)據(jù)的操作,此時(shí)操作最多的是針對(duì)該Object進(jìn)行數(shù)據(jù)的強(qiáng)制轉(zhuǎn)換
- 而這種轉(zhuǎn)換是基于開發(fā)者對(duì)該數(shù)據(jù)類型明確的情況下進(jìn)行(如將Object型轉(zhuǎn)換為String型);若類型不一致,編譯器在編譯過(guò)程中不會(huì)報(bào)錯(cuò),但在運(yùn)行時(shí)會(huì)出錯(cuò)
額外說(shuō)明: List能否轉(zhuǎn)為L(zhǎng)ist?
不能。具體描述如下:
// 代碼1和代碼2相同 // 代碼1 List<String> strings = new LinkedList<String>( ); List<Integer> ints = new LinkedList<Integer>( ); // 代碼2 List strings = new LinkedList( ); List ints = new LinkedList( ); // 轉(zhuǎn)換方式可以是如下: List ss=strings; List<Object> objects=ss;
總結(jié)
本篇片文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Javaweb實(shí)現(xiàn)在線人數(shù)統(tǒng)計(jì)代碼實(shí)例
這篇文章主要介紹了Javaweb實(shí)現(xiàn)在線人數(shù)統(tǒng)計(jì)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11Springboot利用Aop捕捉注解實(shí)現(xiàn)業(yè)務(wù)異步執(zhí)行
在開發(fā)過(guò)程中,盡量會(huì)將比較耗時(shí)且并不會(huì)影響請(qǐng)求的響應(yīng)結(jié)果的業(yè)務(wù)放在異步線程池中進(jìn)行處理,那么到時(shí)什么任務(wù)在執(zhí)行的時(shí)候會(huì)創(chuàng)建單獨(dú)的線程進(jìn)行處理呢?這篇文章主要介紹了Springboot利用Aop捕捉注解實(shí)現(xiàn)業(yè)務(wù)異步執(zhí)行2023-04-04解決org.apache.ibatis.binding.BindingException:?Invalid?boun
這篇文章主要介紹了解決org.apache.ibatis.binding.BindingException:?Invalid?bound?statement?(not?found)問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05SpringBoot整合Log4j2實(shí)現(xiàn)自定義日志打印失效的原因及解決
本文給大家介紹了關(guān)于SpringBoot項(xiàng)目整合Log4j2實(shí)現(xiàn)自定義日志打印失效原因及解決辦法,主要的原因是因?yàn)镾pringBoot的logback包的存在,文中通過(guò)圖文給大家了詳細(xì)解決方法,需要的朋友可以參考下2024-01-01SpringBoot2.3整合redis緩存自定義序列化的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot2.3整合redis緩存自定義序列化的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08如何在Spring?Boot框架中使用攔截器實(shí)現(xiàn)URL限制
在Spring?Boot框架中,您可以使用攔截器(Interceptor)來(lái)控制限制URL列表,本文通過(guò)一個(gè)簡(jiǎn)單的示例給大家介紹Spring?Boot?攔截器實(shí)現(xiàn)URL限制的操作方法,感興趣的朋友跟隨小編一起看看吧2023-08-08java學(xué)習(xí)之理解自動(dòng)拆裝箱特性
這篇文章主要介紹java自動(dòng)拆裝箱特性以及java自動(dòng)拆裝箱的應(yīng)用,有需要的朋友可以借鑒參考下,希望可以有所幫助,祝大家早日升職加薪2021-09-09