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

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

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

舉個例子

我們先舉一個最簡單的例子:

@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);
    }
}

上面的例子中,我們定義了一個ArrayList,其中指定的類型是String。

然后調用了action方法,action方法需要傳入一個ArrayList,但是這個list的類型是Object。

乍看之下好像沒有問題,因為String是Object的子類,是可以進行轉換的。

但是實際上代碼編譯出錯:

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

原因

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

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

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

解決辦法

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

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

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

但是要注意這里actionTwo方法中,因為我們不知道傳入的類型到底是什么,所以我們不能在actionTwo中添加任何元素。

總結

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

但是Object[] objArray是String[] strArr的父類。因為對Array來說,其具體的類型是已知的。

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

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

相關文章

  • Java 多線程synchronized關鍵字詳解(六)

    Java 多線程synchronized關鍵字詳解(六)

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

    Java創(chuàng)建線程三種方式的優(yōu)缺點

    今天小編就為大家分享一篇關于Java創(chuàng)建線程三種方式的優(yōu)缺點,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Java中i++與++i的區(qū)別和使用

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

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

    spring-boot整合Micrometer+Prometheus的詳細過程

    這篇文章主要介紹了springboot整合Micrometer+Prometheus的詳細過程,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-05-05
  • Mybatis plus中使用in查詢出錯如何解決

    Mybatis plus中使用in查詢出錯如何解決

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

    淺析Java中Apache BeanUtils和Spring BeanUtils的用法

    這篇文章主要介紹了Java中Apache BeanUtils和Spring BeanUtils的用法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • 用java等語言仿360首頁拼音輸入全模糊搜索和自動換膚

    用java等語言仿360首頁拼音輸入全模糊搜索和自動換膚

    這篇文章主要為大家詳細介紹了仿360首頁支持拼音輸入全模糊搜索和自動換膚的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • jenkins 構建項目之 pipeline基礎教程

    jenkins 構建項目之 pipeline基礎教程

    &#8203;pipeline ,簡單來說,就是一套運行在 jenkins 上的工作流框架。這篇文章主要介紹了jenkins 構建項目之 pipeline基礎教程,需要的朋友可以參考下
    2020-07-07
  • 詳解Java創(chuàng)建線程的五種常見方式

    詳解Java創(chuàng)建線程的五種常見方式

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

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

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

最新評論

梅河口市| 兴海县| 静安区| 库尔勒市| 扎鲁特旗| 永平县| 霞浦县| 哈巴河县| 奉新县| 綦江县| 平乡县| 九江市| 华池县| 武安市| 定州市| 襄垣县| 南丰县| 茌平县| 分宜县| 滨海县| 长海县| 溧水县| 兴隆县| 楚雄市| 揭阳市| 鱼台县| 宜丰县| 大化| 航空| 内江市| 怀宁县| 晋州市| 东方市| 汽车| 贵定县| 海口市| 柘荣县| 安宁市| 普兰店市| 昭通市| 保定市|