java中的類(lèi)型擦除type?erasure示例詳解
舉個(gè)例子
我們先舉一個(gè)最簡(jiǎn)單的例子:
@Slf4j
public class TypeErase {
public static void main(String[] args) {
ArrayList<String> stringArrayList = new ArrayList<String>();
stringArrayList.add("a");
stringArrayList.add("b");
action(stringArrayList);
}
public static void action(ArrayList<Object> al){
for(Object o: al)
log.info("{}",o);
}
}上面的例子中,我們定義了一個(gè)ArrayList,其中指定的類(lèi)型是String。
然后調(diào)用了action方法,action方法需要傳入一個(gè)ArrayList,但是這個(gè)list的類(lèi)型是Object。
乍看之下好像沒(méi)有問(wèn)題,因?yàn)镾tring是Object的子類(lèi),是可以進(jìn)行轉(zhuǎn)換的。
但是實(shí)際上代碼編譯出錯(cuò):
Error:(18, 16) java: 不兼容的類(lèi)型: java.util.ArrayList<java.lang.String>無(wú)法轉(zhuǎn)換為java.util.ArrayList<java.lang.Object>
原因
上面例子的原因就是類(lèi)型擦除(type erasure)。java中的泛型是在編譯時(shí)做檢測(cè)的。而編譯后生成的二進(jìn)制文件中并不保存類(lèi)型相關(guān)的信息。
上面的例子中,編譯之后不管是ArrayList<String> 還是ArrayList<Object> 都會(huì)變成ArrayList。其中的類(lèi)型Object/String對(duì)JVM是不可見(jiàn)的。
但是在編譯的過(guò)程中,編譯器發(fā)現(xiàn)了兩者的類(lèi)型不同,然后拋出了錯(cuò)誤。
解決辦法
要解決上面的問(wèn)題,我們可以使用下面的辦法:
public static void actionTwo(ArrayList<?> al){
for(Object o: al)
log.info("{}",o);
}通過(guò)使用通配符?,可以匹配任何類(lèi)型,從而通過(guò)編譯。
但是要注意這里actionTwo方法中,因?yàn)槲覀儾恢纻魅氲念?lèi)型到底是什么,所以我們不能在actionTwo中添加任何元素。
總結(jié)
從上面的例子我們可以看出,ArrayList<String>并不是ArrayList<Object>的子類(lèi)。如果一定要找出父子關(guān)系,那么ArrayList<String>是Collection<String>的子類(lèi)。
但是Object[] objArray是String[] strArr的父類(lèi)。因?yàn)閷?duì)Array來(lái)說(shuō),其具體的類(lèi)型是已知的。
本文的例子https://github.com/ddean2009/learn-java-collections
以上就是java中的類(lèi)型擦除type erasure示例詳解的詳細(xì)內(nèi)容,更多關(guān)于java類(lèi)型擦除type erasure的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java 多線程synchronized關(guān)鍵字詳解(六)
這篇文章主要介紹了Java 多線程synchronized關(guān)鍵字詳解(六)的相關(guān)資料,需要的朋友可以參考下2015-12-12
Java創(chuàng)建線程三種方式的優(yōu)缺點(diǎn)
今天小編就為大家分享一篇關(guān)于Java創(chuàng)建線程三種方式的優(yōu)缺點(diǎn),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12
spring-boot整合Micrometer+Prometheus的詳細(xì)過(guò)程
這篇文章主要介紹了springboot整合Micrometer+Prometheus的詳細(xì)過(guò)程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-05-05
Mybatis plus中使用in查詢出錯(cuò)如何解決
這篇文章主要介紹了Mybatis plus中使用in查詢出錯(cuò)的問(wèn)題及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
淺析Java中Apache BeanUtils和Spring BeanUtils的用法
這篇文章主要介紹了Java中Apache BeanUtils和Spring BeanUtils的用法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
用java等語(yǔ)言仿360首頁(yè)拼音輸入全模糊搜索和自動(dòng)換膚
這篇文章主要為大家詳細(xì)介紹了仿360首頁(yè)支持拼音輸入全模糊搜索和自動(dòng)換膚的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
jenkins 構(gòu)建項(xiàng)目之 pipeline基礎(chǔ)教程
​pipeline ,簡(jiǎn)單來(lái)說(shuō),就是一套運(yùn)行在 jenkins 上的工作流框架。這篇文章主要介紹了jenkins 構(gòu)建項(xiàng)目之 pipeline基礎(chǔ)教程,需要的朋友可以參考下2020-07-07
詳解Java創(chuàng)建線程的五種常見(jiàn)方式
Java中如何進(jìn)行多線程編程,如何使用多線程?不要擔(dān)心,本文將為你詳細(xì)介紹一下Java實(shí)現(xiàn)線程創(chuàng)建的五種常見(jiàn)方式,感興趣的可以跟隨小編學(xué)習(xí)一下2022-01-01

