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(...));就會報錯,因?yàn)槲覀円呀?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); }
來看看運(yùn)行結(jié)果:
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ū)別啦~小伙伴們了解了吧
下面來看看?的擴(kuò)展寫法:
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}
可以看到正常輸出,因?yàn)榧现械臄?shù)據(jù)都是Teacher的子類類型,如果我們將List<? extends Teacher> list
改成List<? extends Student> list
會出現(xiàn)什么情況?
仔細(xì)看這張圖,我們新建了一個list3并且聲明數(shù)據(jù)類型為Teacher,這個時候調(diào)用show3(List<? extends Student> list)
就馬上會報錯的,錯誤信息提示Teacher不能轉(zhuǎn)換成Student,因?yàn)镾tudent是Teacher的子類,而我們只接受Student及它的子類,所以當(dāng)然會報錯了。
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對象,看看結(jié)果:
Student{name='sunba', age=30, sex=0} Teacher{name='zhaoliu', age=22, sex=1}
沒毛病,正常運(yùn)行并輸出。
下面我們來看看,如果我們是傳遞的 Student的子類的集合會咋樣
可以看到和之前的一樣,會報錯,理由也是一樣的,以為我們已經(jīng)定義了只能接收Student及其父類的數(shù)據(jù)類型。
最后來看一種情況
如果我定義List的時候沒有指定數(shù)據(jù)類型,并且插入了一個Child,Student,Teacher,還是調(diào)用show4(List<? super Student> list)
,會報錯嗎?不會報錯,運(yùn)行結(jié)果又會是什么呢?
可以看到這樣并沒有報錯,因?yàn)閘ist可以存放多種數(shù)據(jù)類型,那么調(diào)用show4方法時會是什么結(jié)果呢?
可以看到程序正常運(yùn)行并輸出結(jié)果,注意一點(diǎn),我們接收的是Student及其父類對象數(shù)據(jù)類型,因?yàn)槲覀兊腃hild是繼承Student的,所以程序自動將我們的Child轉(zhuǎn)成父類Student進(jìn)行輸出,所以大家要注意這一點(diǎn),會自動向上轉(zhuǎn)化。
總結(jié)
相信大家看了這個以后一定再也不會弄混二者的區(qū)別了吧,他們倆還是很容易弄清楚的,這些東西只要弄清楚了以后就也忘不掉了
到此這篇關(guān)于java泛型中占位符T和?有什么區(qū)別的文章就介紹到這了,更多相關(guān)java泛型占位符T和?內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決Springboot-application.properties中文亂碼問題
這篇文章主要介紹了解決Springboot-application.properties中文亂碼問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11Spring Boot實(shí)戰(zhàn)之逐行釋義Hello World程序
spring boot 是基于Spring的一個框架,Spring boot幫我們集成很多常用的功能,使得整個配置更加簡單。這篇文章主要介紹了Spring Boot實(shí)戰(zhàn)之逐行釋義Hello World,需要的朋友可以參考下2017-12-12IDEA運(yùn)行導(dǎo)入的javaweb項(xiàng)目tomcat正常,但是運(yùn)行失敗404問題
這篇文章主要介紹了IDEA運(yùn)行導(dǎo)入的javaweb項(xiàng)目tomcat正常但是運(yùn)行失敗404問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07Java TCP網(wǎng)絡(luò)通信協(xié)議詳細(xì)講解
TCP/IP是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,它會保證數(shù)據(jù)不丟包、不亂序。TCP全名是Transmission?Control?Protocol,它是位于網(wǎng)絡(luò)OSI模型中的第四層2022-09-09解決Spring?Boot應(yīng)用打包后文件訪問問題
在Spring Boot項(xiàng)目的開發(fā)過程中,一個常見的挑戰(zhàn)是如何有效地訪問和操作資源文件,本文就來介紹一下解決Spring?Boot應(yīng)用打包后文件訪問問題,感興趣的可以了解一下2024-01-01解決SpringBoot內(nèi)嵌Tomcat并發(fā)容量的問題
這篇文章主要介紹了解決SpringBoot內(nèi)嵌Tomcat并發(fā)容量的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06SpringBoot入坑筆記之spring-boot-starter-web 配置文件的使用
本篇向小伙伴介紹springboot配置文件的配置,已經(jīng)全局配置參數(shù)如何使用的。需要的朋友跟隨腳本之家小編一起學(xué)習(xí)吧2018-01-01