最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中的類(lèi)型擦除type?erasure示例詳解

 更新時(shí)間:2023年09月15日 09:46:24   作者:flydean  
泛型是java從JDK?5開(kāi)始引入的新特性,泛型的引入可以讓我們?cè)诖a編譯的時(shí)候就強(qiáng)制檢查傳入的類(lèi)型,從而提升了程序的健壯度,泛型可以用在類(lèi)和接口上,在集合類(lèi)中非常常見(jiàn),本文將會(huì)講解泛型導(dǎo)致的類(lèi)型擦除

舉個(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)鍵字詳解(六)

    這篇文章主要介紹了Java 多線程synchronized關(guān)鍵字詳解(六)的相關(guān)資料,需要的朋友可以參考下
    2015-12-12
  • Java創(chuàng)建線程三種方式的優(yōu)缺點(diǎn)

    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
  • Java中i++與++i的區(qū)別和使用

    Java中i++與++i的區(qū)別和使用

    這篇文章主要介紹了Java中i++與++i的區(qū)別和使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • spring-boot整合Micrometer+Prometheus的詳細(xì)過(guò)程

    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ò)如何解決

    這篇文章主要介紹了Mybatis plus中使用in查詢出錯(cuò)的問(wèn)題及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 淺析Java中Apache BeanUtils和Spring BeanUtils的用法

    淺析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)換膚

    用java等語(yǔ)言仿360首頁(yè)拼音輸入全模糊搜索和自動(dòng)換膚

    這篇文章主要為大家詳細(xì)介紹了仿360首頁(yè)支持拼音輸入全模糊搜索和自動(dòng)換膚的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • jenkins 構(gòu)建項(xiàng)目之 pipeline基礎(chǔ)教程

    jenkins 構(gòu)建項(xiàng)目之 pipeline基礎(chǔ)教程

    &#8203;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創(chuàng)建線程的五種常見(jiàn)方式

    Java中如何進(jìn)行多線程編程,如何使用多線程?不要擔(dān)心,本文將為你詳細(xì)介紹一下Java實(shí)現(xiàn)線程創(chuàng)建的五種常見(jiàn)方式,感興趣的可以跟隨小編學(xué)習(xí)一下
    2022-01-01
  • java實(shí)現(xiàn)酒店管理系統(tǒng)

    java實(shí)現(xiàn)酒店管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)酒店管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02

最新評(píng)論

乾安县| 馆陶县| 连江县| 大新县| 古丈县| 福安市| 蒙城县| 临洮县| 吉水县| 东乡族自治县| 若羌县| 甘洛县| 连城县| 鲁山县| 平度市| 阳西县| 桓仁| 舒兰市| 涪陵区| 红桥区| 金山区| 田东县| 清涧县| 兰坪| 姜堰市| 儋州市| 灌阳县| 泸定县| 沙坪坝区| 都兰县| 台南县| 高邑县| 怀安县| 乌拉特前旗| 苏尼特右旗| 马边| 德庆县| 湖南省| 金溪县| 泌阳县| 长春市|