欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java中的類型擦除type?erasure示例詳解

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

舉個(gè)例子

我們先舉一個(gè)最簡單的例子:

@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,其中指定的類型是String。

然后調(diào)用了action方法,action方法需要傳入一個(gè)ArrayList,但是這個(gè)list的類型是Object。

乍看之下好像沒有問題,因?yàn)镾tring是Object的子類,是可以進(jìn)行轉(zhuǎn)換的。

但是實(shí)際上代碼編譯出錯(cuò):

Error:(18, 16) java: 不兼容的類型: java.util.ArrayList<java.lang.String>無法轉(zhuǎn)換為java.util.ArrayList<java.lang.Object>

原因

上面例子的原因就是類型擦除(type erasure)。java中的泛型是在編譯時(shí)做檢測的。而編譯后生成的二進(jìn)制文件中并不保存類型相關(guān)的信息。

上面的例子中,編譯之后不管是ArrayList<String> 還是ArrayList<Object> 都會變成ArrayList。其中的類型Object/String對JVM是不可見的。

但是在編譯的過程中,編譯器發(fā)現(xiàn)了兩者的類型不同,然后拋出了錯(cuò)誤。

解決辦法

要解決上面的問題,我們可以使用下面的辦法:

public static void actionTwo(ArrayList<?> al){
        for(Object o: al)
            log.info("{}",o);
    }

通過使用通配符?,可以匹配任何類型,從而通過編譯。

但是要注意這里actionTwo方法中,因?yàn)槲覀儾恢纻魅氲念愋偷降资鞘裁?,所以我們不能在actionTwo中添加任何元素。

總結(jié)

從上面的例子我們可以看出,ArrayList<String>并不是ArrayList<Object>的子類。如果一定要找出父子關(guān)系,那么ArrayList<String>是Collection<String>的子類。

但是Object[] objArray是String[] strArr的父類。因?yàn)閷rray來說,其具體的類型是已知的。

本文的例子https://github.com/ddean2009/learn-java-collections

以上就是java中的類型擦除type erasure示例詳解的詳細(xì)內(nèi)容,更多關(guān)于java類型擦除type erasure的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Nacos?版本不一致報(bào)錯(cuò)Request?nacos?server?failed解決

    Nacos?版本不一致報(bào)錯(cuò)Request?nacos?server?failed解決

    這篇文章主要為大家介紹了Nacos?版本不一致報(bào)錯(cuò)Request?nacos?server?failed的解決方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 基于Java 談回調(diào)函數(shù)

    基于Java 談回調(diào)函數(shù)

    回調(diào)函數(shù)就是一個(gè)通過函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)函數(shù),當(dāng)這個(gè)指針被用來調(diào)用其所 指向的函數(shù)時(shí),我們就說這是回調(diào)函數(shù)
    2017-05-05
  • Java獲取鏈接上的參數(shù)三種方法舉例

    Java獲取鏈接上的參數(shù)三種方法舉例

    在Java中,我們經(jīng)常需要從URL鏈接中獲取參數(shù),下面這篇文章主要給大家介紹了關(guān)于Java如何獲取鏈接上參數(shù)的三種方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • java用類加載器的5種方式讀取.properties文件

    java用類加載器的5種方式讀取.properties文件

    這篇文章主要介紹了java用類加載器的5種方式讀取.properties文件,詳細(xì)的介紹了這5種方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-11-11
  • SpringBoot整合Dubbo框架,實(shí)現(xiàn)RPC服務(wù)遠(yuǎn)程調(diào)用

    SpringBoot整合Dubbo框架,實(shí)現(xiàn)RPC服務(wù)遠(yuǎn)程調(diào)用

    Dubbo是一款高性能、輕量級的開源Java RPC框架,它提供了三大核心能力:面向接口的遠(yuǎn)程方法調(diào)用,智能容錯(cuò)和負(fù)載均衡,以及服務(wù)自動(dòng)注冊和發(fā)現(xiàn)。今天就來看下SpringBoot整合Dubbo框架的步驟
    2021-06-06
  • Mybatis-plus更新Null字段的四種方法

    Mybatis-plus更新Null字段的四種方法

    在項(xiàng)目開發(fā)過程中,經(jīng)常會使用Mybatis-plus的updateById()方法,快速將接收道德參數(shù)或者查詢結(jié)果中原本不為null的字段更新為null,這個(gè)時(shí)候使用updateById()并不能實(shí)現(xiàn)這個(gè)操作,不會報(bào)錯(cuò),但是對應(yīng)的字段并沒有更新為null,所以本文介紹了Mybatis-plus更新Null字段的方法
    2025-03-03
  • Java實(shí)現(xiàn)級聯(lián)下拉結(jié)構(gòu)的示例代碼

    Java實(shí)現(xiàn)級聯(lián)下拉結(jié)構(gòu)的示例代碼

    在開發(fā)過程中,會遇到很多的實(shí)體需要將查出的數(shù)據(jù)處理為下拉或者級聯(lián)下拉的結(jié)構(gòu),提供給前端進(jìn)行展示。本文為大家介紹了java封裝下拉和級聯(lián)下拉的通用工具類,需要的可以參考一下
    2022-06-06
  • IDEA添加Java類注釋模版的方法

    IDEA添加Java類注釋模版的方法

    本篇文章主要介紹了IDEA添加Java類注釋模版的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-12-12
  • Java中Lambda表達(dá)式的使用詳細(xì)教程

    Java中Lambda表達(dá)式的使用詳細(xì)教程

    這篇文章將通過示例為大家詳細(xì)展示Java中Lambda表達(dá)式的用法,同時(shí)也會介紹Lambda的相關(guān)知識,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-05-05
  • Java?RabbitMQ消息隊(duì)列詳解常見問題

    Java?RabbitMQ消息隊(duì)列詳解常見問題

    消息隊(duì)列是最古老的中間件之一,從系統(tǒng)之間有通信需求開始,就自然產(chǎn)生了消息隊(duì)列。本文告訴什么是消息隊(duì)列,為什么需要消息隊(duì)列,常見的消息隊(duì)列有哪些,RabbitMQ的部署和使用
    2022-07-07

最新評論