pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

java泛型中占位符T和?有什么區別

泛型中占位符T和?有什么區別?有的人可能弄不清楚,本文主要介紹了java泛型中占位符T和?有什么區別,具有一定的參考價值,感興趣的可以了解一下

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

先上兩段代碼:

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集合里只能存放同一類型數據,如果插入不同類型數據則會報錯。

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

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

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(...));就會報錯,因為我們已經給List指定了數據類型為Student
   show1(list1);

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

   //這里我們并沒有給List指定具體的數據類型,可以存放多種類型數據
   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的區別了,list2存放了Student和Teacher兩種類型,同樣可以輸出數據,所以這就是T和?的區別啦~小伙伴們了解了吧

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

List<? extends 數據類型> list

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

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

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

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

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

List<? super 數據類型> list

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

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

可以看出來,我們接收的是Student及它父類的集合,我們寫兩個集合數據然后調用試試。

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的子類的集合會咋樣

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

最后來看一種情況

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

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

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

總結

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

到此這篇關于java泛型中占位符T和?有什么區別的文章就介紹到這了,更多相關java泛型占位符T和?內容請搜索html5模板網以前的文章希望大家以后多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

主站蜘蛛池模板: TMT观察网_独特视角观察TMT行业 派财经_聚焦数字经济内容服务平台 | 【MBA备考网】-2024年工商管理硕士MBA院校/报考条件/培训/考试科目/提前面试/考试/学费-MBA备考网 | 低浓度恒温恒湿称量系统,强光光照培养箱-上海三腾仪器有限公司 | 深圳律师咨询_深圳律师事务所_华荣【免费在线法律咨询】网 | 异噻唑啉酮-均三嗪-三丹油-1227-中北杀菌剂厂家 | 硫酸亚铁-聚合硫酸铁-除氟除磷剂-复合碳源-污水处理药剂厂家—长隆科技 | 齿轮减速机_齿轮减速电机-VEMT蜗轮蜗杆减速机马达生产厂家瓦玛特传动瑞环机电 | POS机办理_个人POS机免费领取 - 银联POS机申请首页 | 找果网 | 苹果手机找回方法,苹果iPhone手机丢了找回,认准找果网! | 温控器生产厂家-提供温度开关/热保护器定制与批发-惠州市华恺威电子科技有限公司 | 上海办公室装修,办公楼装修设计,办公空间设计,企业展厅设计_写艺装饰公司 | CTAB,表面活性剂1631溴型(十六烷基三甲基溴化铵)-上海升纬化工原料有限公司 | 玻璃钢型材_拉挤模具_玻璃钢拉挤设备——滑县康百思 | 美缝剂_美缝剂厂家_美缝剂加盟-地老板高端瓷砖美缝剂 | 自恢复保险丝_贴片保险丝_力特保险丝_Littelfuse_可恢复保险丝供应商-秦晋电子 | SMC-ASCO-CKD气缸-FESTO-MAC电磁阀-上海天筹自动化设备官网 | 山东螺杆空压机,烟台空压机,烟台开山空压机-烟台开山机电设备有限公司 | 识禅_对禅的了解,从这里开始| 杭州中央空调维修_冷却塔/新风机柜/热水器/锅炉除垢清洗_除垢剂_风机盘管_冷凝器清洗-杭州亿诺能源有限公司 | 传动滚筒,改向滚筒-淄博建凯机械科技有限公司 | hdpe土工膜-防渗膜-复合土工膜-长丝土工布价格-厂家直销「恒阳新材料」-山东恒阳新材料有限公司 ETFE膜结构_PTFE膜结构_空间钢结构_膜结构_张拉膜_浙江萬豪空间结构集团有限公司 | 飞歌臭氧发生器厂家_水处理臭氧发生器_十大臭氧消毒机品牌 | 集装箱标准养护室-集装箱移动式养护室-广州璟业试验仪器有限公司 | 北京宣传片拍摄_产品宣传片拍摄_宣传片制作公司-现像传媒 | 德州网站开发定制-小程序开发制作-APP软件开发-「两山开发」 | 希望影视-高清影视vip热播电影电视剧免费在线抢先看 | 电缆接头-防爆电缆接头-格兰头-金属电缆接头-防爆填料函 | RO反渗透设备_厂家_价格_河南郑州江宇环保科技有限公司 | 懂研帝_专业SCI论文润色机构_SCI投稿发表服务公司 | 汽车润滑油厂家-机油/润滑油代理-高性能机油-领驰慧润滑科技(河北)有限公司 | 上海噪音治理公司-专业隔音降噪公司-中广通环保 | ALC墙板_ALC轻质隔墙板_隔音防火墙板_轻质隔墙材料-湖北博悦佳 | 真空泵维修保养,普发,阿尔卡特,荏原,卡西亚玛,莱宝,爱德华干式螺杆真空泵维修-东莞比其尔真空机电设备有限公司 | 超声波清洗机_超声波清洗机设备_超声波清洗机厂家_鼎泰恒胜 | 根系分析仪,大米外观品质检测仪,考种仪,藻类鉴定计数仪,叶面积仪,菌落计数仪,抑菌圈测量仪,抗生素效价测定仪,植物表型仪,冠层分析仪-杭州万深检测仪器网 | 粉末冶金-粉末冶金齿轮-粉末冶金零件厂家-东莞市正朗精密金属零件有限公司 | 深圳湾1号房价_深圳湾1号二手房源 | 电主轴,车床电磨头,变频制动电机-博山鸿达特种电机 | 上海单片机培训|重庆曙海培训分支机构—CortexM3+uC/OS培训班,北京linux培训,Windows驱动开发培训|上海IC版图设计,西安linux培训,北京汽车电子EMC培训,ARM培训,MTK培训,Android培训 | 北京软件开发_软件开发公司_北京软件公司-北京宜天信达软件开发公司 | 风电变桨伺服驱动器-风电偏航变桨系统-深圳众城卓越科技有限公司 |