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

java泛型中占位符T和?有什么區(qū)別

 更新時間:2022年05月17日 09:46:10   作者:胖子愛你520  
泛型中占位符T和?有什么區(qū)別?有的人可能弄不清楚,本文主要介紹了java泛型中占位符T和?有什么區(qū)別,具有一定的參考價值,感興趣的可以了解一下

泛型中占位符T和?有什么區(qū)別?這是一個好問題,有的人可能弄不清楚,所以我們這里簡單的演示一下,相信大家一定能弄清楚的!

先上兩段代碼:

public static <T> void show1(List<T> list){
 for (Object object : list) {
        System.out.println(object.toString());
    }
}

public static void show2(List<?> list) {
    for (Object object : list) {
        System.out.println(object);
    }
}

可以看到show1方法中我們使用了T,大家都知道這是泛型的常見寫法,那么這里的T指的是某一類具體的對象,list集合里只能存放同一類型數(shù)據(jù),如果插入不同類型數(shù)據(jù)則會報錯。

那么show2方法中我們使用的是?,可以看到在void前面并沒有<T>,?可以表示成占位符,它自己也不知道list集合中會存放多少種類型的數(shù)據(jù),所以這樣就表明我們的list中存放N種數(shù)據(jù)類型也是可以的。

我們通過一段測試代碼來直觀的感受一下二者的區(qū)別吧:

public static void test(){
   List<Student> list1 = new ArrayList<>();
   list1.add(new Student("zhangsan",18,0));
   list1.add(new Student("lisi",28,0));
   list1.add(new Student("wangwu",24,1));
   //這里如果add(new Teacher(...));就會報錯,因為我們已經(jīng)給List指定了數(shù)據(jù)類型為Student
   show1(list1);

   System.out.println("************分割線**************");

   //這里我們并沒有給List指定具體的數(shù)據(jù)類型,可以存放多種類型數(shù)據(jù)
   List list2 = new ArrayList<>();
   list2.add(new Student("zhaoliu",22,1));
   list2.add(new Teacher("sunba",30,0));
   show2(list2);
}

來看看運行結果:

Student{name='zhangsan', age=18, sex=0}
Student{name='lisi', age=28, sex=0}
Student{name='wangwu', age=24, sex=1}
************分割線**************
Student{name='zhaoliu', age=22, sex=1}
Teacher{name='sunba', age=30, sex=0}

從show2方法可以看出和show1的區(qū)別了,list2存放了Student和Teacher兩種類型,同樣可以輸出數(shù)據(jù),所以這就是T和?的區(qū)別啦~小伙伴們了解了吧

下面來看看?的擴展寫法:

List<? extends 數(shù)據(jù)類型> list

public static void show3(List<? extends Teacher> list) {
    for (Object object : list) {
        System.out.println(object);
    }
}

List<? extends Teacher> list這種寫法表示可以接收Teacher和它的子類數(shù)據(jù)類型的list集合,寫個測試方法show3(list2);試試:

Student{name='zhaoliu', age=22, sex=1}
Teacher{name='sunba', age=30, sex=0}

可以看到正常輸出,因為集合中的數(shù)據(jù)都是Teacher的子類類型,如果我們將List<? extends Teacher> list改成List<? extends Student> list會出現(xiàn)什么情況?

仔細看這張圖,我們新建了一個list3并且聲明數(shù)據(jù)類型為Teacher,這個時候調(diào)用show3(List<? extends Student> list) 就馬上會報錯的,錯誤信息提示Teacher不能轉(zhuǎn)換成Student,因為Student是Teacher的子類,而我們只接受Student及它的子類,所以當然會報錯了。

List<? super 數(shù)據(jù)類型> list

這種寫法表示只接收指定的數(shù)據(jù)類型及它的父類類型,也簡單的寫段代碼看看效果:

public static void show4(List<? super Student> list) {
    for (Object object : list) {
        System.out.println(object);
    }
}

可以看出來,我們接收的是Student及它父類的集合,我們寫兩個集合數(shù)據(jù)然后調(diào)用試試。

List list4 = new ArrayList<>();
list4.add(new Student("sunba",30,0));
list4.add(new Teacher("zhaoliu",22,1));
show4(list4);

在list中插入了一個Student和Teacher對象,看看結果:

Student{name='sunba', age=30, sex=0}
Teacher{name='zhaoliu', age=22, sex=1}

沒毛病,正常運行并輸出。

下面我們來看看,如果我們是傳遞的 Student的子類的集合會咋樣

可以看到和之前的一樣,會報錯,理由也是一樣的,以為我們已經(jīng)定義了只能接收Student及其父類的數(shù)據(jù)類型。

最后來看一種情況

如果我定義List的時候沒有指定數(shù)據(jù)類型,并且插入了一個Child,Student,Teacher,還是調(diào)用show4(List<? super Student> list),會報錯嗎?不會報錯,運行結果又會是什么呢?

可以看到這樣并沒有報錯,因為list可以存放多種數(shù)據(jù)類型,那么調(diào)用show4方法時會是什么結果呢?

可以看到程序正常運行并輸出結果,注意一點,我們接收的是Student及其父類對象數(shù)據(jù)類型,因為我們的Child是繼承Student的,所以程序自動將我們的Child轉(zhuǎn)成父類Student進行輸出,所以大家要注意這一點,會自動向上轉(zhuǎn)化。

總結

相信大家看了這個以后一定再也不會弄混二者的區(qū)別了吧,他們倆還是很容易弄清楚的,這些東西只要弄清楚了以后就也忘不掉了

到此這篇關于java泛型中占位符T和?有什么區(qū)別的文章就介紹到這了,更多相關java泛型占位符T和?內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • JAVA使用hutool工具實現(xiàn)查詢樹結構數(shù)據(jù)(省市區(qū))

    JAVA使用hutool工具實現(xiàn)查詢樹結構數(shù)據(jù)(省市區(qū))

    今天通過本文給大家分享JAVA使用hutool工具實現(xiàn)查詢樹結構數(shù)據(jù)(省市區(qū)),代碼分為表結構和數(shù)據(jù)結構,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-08-08
  • 10本Java架構師必讀書籍

    10本Java架構師必讀書籍

    這篇文章主要介紹了10本Java架構師必讀書籍,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Spring中property-placeholder的使用與解析詳解

    Spring中property-placeholder的使用與解析詳解

    本篇文章主要介紹了Spring中property-placeholder的使用與解析詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • SpringBoot+Jersey跨域文件上傳的實現(xiàn)示例

    SpringBoot+Jersey跨域文件上傳的實現(xiàn)示例

    在SpringBoot開發(fā)后端服務時,我們一般是提供接口給前端使用,本文主要介紹了SpringBoot+Jersey跨域文件上傳的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2024-07-07
  • 使用ThreadPoolExecutor之高效處理并發(fā)任務

    使用ThreadPoolExecutor之高效處理并發(fā)任務

    這篇文章主要介紹了使用ThreadPoolExecutor之高效處理并發(fā)任務,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • java實現(xiàn)背單詞程序

    java實現(xiàn)背單詞程序

    這篇文章主要為大家詳細介紹了java實現(xiàn)背單詞程序,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • 深入理解Java8新特性之Lambda表達式的基本語法和自定義函數(shù)式接口

    深入理解Java8新特性之Lambda表達式的基本語法和自定義函數(shù)式接口

    Lambda 表達式,也可稱為閉包,它是推動 Java 8 發(fā)布的最重要新特性。Lambda 允許把函數(shù)作為一個方法的參數(shù)(函數(shù)作為參數(shù)傳遞進方法中)。使用 Lambda 表達式可以使代碼變的更加簡潔緊湊
    2021-11-11
  • Java中的抽象工廠模式_動力節(jié)點Java學院整理

    Java中的抽象工廠模式_動力節(jié)點Java學院整理

    抽象工廠模式是工廠方法模式的升級版本,他用來創(chuàng)建一組相關或者相互依賴的對象。下面通過本文給大家分享Java中的抽象工廠模式,感興趣的朋友一起看看吧
    2017-08-08
  • Java信號量全解析

    Java信號量全解析

    這篇文章主要介紹了Java信號量的相關資料,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2021-01-01
  • Java AtomicInteger類使用方法實例講解

    Java AtomicInteger類使用方法實例講解

    這篇文章主要介紹了Java AtomicInteger類使用方法實例講解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06

最新評論

文登市| 鄱阳县| 民权县| 台前县| 泰安市| 依安县| 巴彦县| 南平市| 大安市| 桦川县| 都江堰市| 容城县| 古交市| 西城区| 玉龙| 神农架林区| 容城县| 东台市| 柘城县| 彩票| 伊金霍洛旗| 建平县| 黎城县| 香河县| 武乡县| 增城市| 资溪县| 鄱阳县| 平泉县| 成武县| 巴东县| 建水县| 通城县| 沾益县| 汝州市| 南溪县| 鲜城| 兖州市| 合阳县| 大悟县| 车险|