摘要:前言從今天開(kāi)始進(jìn)入基礎(chǔ)的復(fù)習(xí),可能一個(gè)星期會(huì)有一篇的十道簡(jiǎn)單算法,我寫博文的未必都是正確的如果有寫錯(cuò)的地方請(qǐng)大家多多包涵并指正今天要復(fù)習(xí)的是泛型,泛型在中也是個(gè)很重要的知識(shí)點(diǎn),本文主要講解基礎(chǔ)的概念,并不是高深的知識(shí),如果基礎(chǔ)好的同學(xué)可以當(dāng)
前言
從今天開(kāi)始進(jìn)入Java基礎(chǔ)的復(fù)習(xí),可能一個(gè)星期會(huì)有一篇的<十道簡(jiǎn)單算法>,我寫博文的未必都是正確的~如果有寫錯(cuò)的地方請(qǐng)大家多多包涵并指正~
今天要復(fù)習(xí)的是泛型,泛型在Java中也是個(gè)很重要的知識(shí)點(diǎn),本文主要講解基礎(chǔ)的概念,并不是高深的知識(shí),如果基礎(chǔ)好的同學(xué)可以當(dāng)復(fù)習(xí)看看~
一、什么是泛型?Java泛型設(shè)計(jì)原則:只要在編譯時(shí)期沒(méi)有出現(xiàn)警告,那么運(yùn)行時(shí)期就不會(huì)出現(xiàn)ClassCastException異常.
泛型:把類型明確的工作推遲到創(chuàng)建對(duì)象或調(diào)用方法的時(shí)候才去明確的特殊的類型
參數(shù)化類型:
把類型當(dāng)作是參數(shù)一樣傳遞
<數(shù)據(jù)類型> 只能是引用類型
相關(guān)術(shù)語(yǔ):
ArrayList
ArrayList
整個(gè)稱為ArrayList
整個(gè)ArrayList
早期Java是使用Object來(lái)代表任意類型的,但是向下轉(zhuǎn)型有強(qiáng)轉(zhuǎn)的問(wèn)題,這樣程序就不太安全
首先,我們來(lái)試想一下:沒(méi)有泛型,集合會(huì)怎么樣
Collection、Map集合對(duì)元素的類型是沒(méi)有任何限制的。本來(lái)我的Collection集合裝載的是全部的Dog對(duì)象,但是外邊把Cat對(duì)象存儲(chǔ)到集合中,是沒(méi)有任何語(yǔ)法錯(cuò)誤的。
把對(duì)象扔進(jìn)集合中,集合是不知道元素的類型是什么的,僅僅知道是Object。因此在get()的時(shí)候,返回的是Object。外邊獲取該對(duì)象,還需要強(qiáng)制轉(zhuǎn)換
有了泛型以后:
代碼更加簡(jiǎn)潔【不用強(qiáng)制轉(zhuǎn)換】
程序更加健壯【只要編譯時(shí)期沒(méi)有警告,那么運(yùn)行時(shí)期就不會(huì)出現(xiàn)ClassCastException異常】
可讀性和穩(wěn)定性【在編寫集合的時(shí)候,就限定了類型】
2.1有了泛型后使用增強(qiáng)for遍歷集合在創(chuàng)建集合的時(shí)候,我們明確了集合的類型了,所以我們可以使用增強(qiáng)for來(lái)遍歷集合!
//創(chuàng)建集合對(duì)象 ArrayList三、泛型基礎(chǔ) 3.1泛型類list = new ArrayList<>(); list.add("hello"); list.add("world"); list.add("java"); //遍歷,由于明確了類型.我們可以增強(qiáng)for for (String s : list) { System.out.println(s); }
泛型類就是把泛型定義在類上,用戶使用該類的時(shí)候,才把類型明確下來(lái)....這樣的話,用戶明確了什么類型,該類就代表著什么類型...用戶在使用的時(shí)候就不用擔(dān)心強(qiáng)轉(zhuǎn)的問(wèn)題,運(yùn)行時(shí)轉(zhuǎn)換異常的問(wèn)題了。
在類上定義的泛型,在類的方法中也可以使用!
/* 1:把泛型定義在類上 2:類型變量定義在類上,方法中也可以使用 */ public class ObjectTool{ private T obj; public T getObj() { return obj; } public void setObj(T obj) { this.obj = obj; } }
測(cè)試代碼:
用戶想要使用哪種類型,就在創(chuàng)建的時(shí)候指定類型。使用的時(shí)候,該類就會(huì)自動(dòng)轉(zhuǎn)換成用戶想要使用的類型了。
public static void main(String[] args) { //創(chuàng)建對(duì)象并指定元素類型 ObjectTool3.2泛型方法tool = new ObjectTool<>(); tool.setObj(new String("鐘福成")); String s = tool.getObj(); System.out.println(s); //創(chuàng)建對(duì)象并指定元素類型 ObjectTool objectTool = new ObjectTool<>(); /** * 如果我在這個(gè)對(duì)象里傳入的是String類型的,它在編譯時(shí)期就通過(guò)不了了. */ objectTool.setObj(10); int i = objectTool.getObj(); System.out.println(i); }
前面已經(jīng)介紹了泛型類了,在類上定義的泛型,在方法中也可以使用.....
現(xiàn)在呢,我們可能就僅僅在某一個(gè)方法上需要使用泛型....外界僅僅是關(guān)心該方法,不關(guān)心類其他的屬性...這樣的話,我們?cè)谡麄€(gè)類上定義泛型,未免就有些大題小作了。
定義泛型方法....泛型是先定義后使用的
//定義泛型方法.. publicvoid show(T t) { System.out.println(t); }
測(cè)試代碼:
用戶傳遞進(jìn)來(lái)的是什么類型,返回值就是什么類型了
public static void main(String[] args) { //創(chuàng)建對(duì)象 ObjectTool tool = new ObjectTool(); //調(diào)用方法,傳入的參數(shù)是什么類型,返回值就是什么類型 tool.show("hello"); tool.show(12); tool.show(12.5); }3.3泛型類派生出的子類
前面我們已經(jīng)定義了泛型類,泛型類是擁有泛型這個(gè)特性的類,它本質(zhì)上還是一個(gè)Java類,那么它就可以被繼承
那它是怎么被繼承的呢??這里分兩種情況
子類明確泛型類的類型參數(shù)變量
子類不明確泛型類的類型參數(shù)變量
3.3.1子類明確泛型類的類型參數(shù)變量泛型接口
/* 把泛型定義在接口上 */ public interface Inter{ public abstract void show(T t); }
實(shí)現(xiàn)泛型接口的類.....
/** * 子類明確泛型類的類型參數(shù)變量: */ public class InterImpl implements Inter3.3.2子類不明確泛型類的類型參數(shù)變量{ @Override public void show(String s) { System.out.println(s); } }
當(dāng)子類不明確泛型類的類型參數(shù)變量時(shí),外界使用子類的時(shí)候,也需要傳遞類型參數(shù)變量進(jìn)來(lái),在實(shí)現(xiàn)類上需要定義出類型參數(shù)變量
/** * 子類不明確泛型類的類型參數(shù)變量: * 實(shí)現(xiàn)類也要定義出類型的 * */ public class InterImpl implements Inter { @Override public void show(T t) { System.out.println(t); } }
測(cè)試代碼:
public static void main(String[] args) { //測(cè)試第一種情況 //Interi = new InterImpl(); //i.show("hello"); //第二種情況測(cè)試 Inter ii = new InterImpl<>(); ii.show("100"); }
值得注意的是:
實(shí)現(xiàn)類的要是重寫父類的方法,返回值的類型是要和父類一樣的!
類上聲明的泛形只對(duì)非靜態(tài)成員有效
3.4類型通配符為什么需要類型通配符????我們來(lái)看一個(gè)需求.......
現(xiàn)在有個(gè)需求:方法接收一個(gè)集合參數(shù),遍歷集合并把集合元素打印出來(lái),怎么辦?
按照我們沒(méi)有學(xué)習(xí)泛型之前,我們可能會(huì)這樣做:
public void test(List list){ for(int i=0;i上面的代碼是正確的,只不過(guò)在編譯的時(shí)候會(huì)出現(xiàn)警告,說(shuō)沒(méi)有確定集合元素的類型....這樣是不優(yōu)雅的...
那我們學(xué)習(xí)了泛型了,現(xiàn)在要怎么做呢??有的人可能會(huì)這樣做:
public void test(List
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/68891.html
摘要:往期第一課體驗(yàn)第二課基礎(chǔ)類型和入門高級(jí)類型第三課泛型第四課解讀高級(jí)類型插一課本來(lái)打算接著上節(jié)課把高級(jí)類型都講完但是寫著寫著我發(fā)現(xiàn)高級(jí)類型中有很多地方都需要泛型的知識(shí)那么先插一節(jié)泛型什么是類型變量和泛型變量的概念我們都知道可以表示任意數(shù)據(jù)類型 往期 第一課, 體驗(yàn)typescript 第二課, 基礎(chǔ)類型和入門高級(jí)類型 第三課, 泛型 第四課, 解讀高級(jí)類型 插一課 本來(lái)打算接著上節(jié)課, ...
摘要:前言由于寫的文章已經(jīng)是有點(diǎn)多了,為了自己和大家的檢索方便,于是我就做了這么一個(gè)博客導(dǎo)航。 前言 由于寫的文章已經(jīng)是有點(diǎn)多了,為了自己和大家的檢索方便,于是我就做了這么一個(gè)博客導(dǎo)航。 由于更新比較頻繁,因此隔一段時(shí)間才會(huì)更新目錄導(dǎo)航哦~想要獲取最新原創(chuàng)的技術(shù)文章歡迎關(guān)注我的公眾號(hào):Java3y Java3y文章目錄導(dǎo)航 Java基礎(chǔ) 泛型就這么簡(jiǎn)單 注解就這么簡(jiǎn)單 Druid數(shù)據(jù)庫(kù)連接池...
摘要:然而中的泛型使用了類型擦除,所以只是偽泛型??偨Y(jié)本文介紹了泛型的使用,以及類型擦除相關(guān)的問(wèn)題。一般情況下泛型的使用比較簡(jiǎn)單,但是某些情況下,尤其是自己編寫使用泛型的類或者方法時(shí)要注意類型擦除的問(wèn)題。 簡(jiǎn)介 Java 在 1.5 引入了泛型機(jī)制,泛型本質(zhì)是參數(shù)化類型,也就是說(shuō)變量的類型是一個(gè)參數(shù),在使用時(shí)再指定為具體類型。泛型可以用于類、接口、方法,通過(guò)使用泛型可以使代碼更簡(jiǎn)單、安全。然...
摘要:首先,我們來(lái)按照泛型的標(biāo)準(zhǔn)重新設(shè)計(jì)一下類。注意參數(shù)為而不是泛型。利用形式的通配符,可以實(shí)現(xiàn)泛型的向上轉(zhuǎn)型,來(lái)看例子。需要注意的是,無(wú)法從這樣類型的中取出數(shù)據(jù)。showImg(https://user-gold-cdn.xitu.io/2019/5/17/16ac3bf3eb16160c); 00、故事的起源 二哥,要不我上大學(xué)的時(shí)候也學(xué)習(xí)編程吧?有一天,三妹突發(fā)奇想地問(wèn)我。 你確定要做一名...
閱讀 3495·2021-10-08 10:15
閱讀 6258·2021-09-23 11:56
閱讀 1528·2019-08-30 15:55
閱讀 528·2019-08-29 16:05
閱讀 2787·2019-08-29 12:34
閱讀 2096·2019-08-29 12:18
閱讀 968·2019-08-26 12:02
閱讀 1715·2019-08-26 12:00