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

Java 泛型詳解與范例

 更新時(shí)間:2021年11月08日 09:35:05   作者:飛人01_01  
hello !大家好!今天的主題就是:泛型。在使用集合類(lèi)時(shí),大家就已經(jīng)接觸到泛型了,那就是每個(gè)集合類(lèi)后面的尖括號(hào)<>,這樣一對(duì)尖括號(hào),在java中就稱為泛型。那么泛型這一個(gè)點(diǎn),我們又該知道多少呢?我們往下看

一、泛型的使用

前面我們學(xué)集合的時(shí)候,簡(jiǎn)單的說(shuō)過(guò)泛型的使用。如下:

ArrayList<Integer> list = new ArrayList<>();
Queue<Integer> queue = new LinkedList<>();

那么使用是這樣的簡(jiǎn)單,該注意什么?

  • 尖括號(hào)里的類(lèi)型,只能寫(xiě)引用類(lèi)型
  • 基礎(chǔ)數(shù)據(jù)類(lèi)型的話,就需要寫(xiě)相應(yīng)的包裝類(lèi)型
  • 泛型只是編譯時(shí)期的一種機(jī)制,在運(yùn)行時(shí)是沒(méi)有泛型的概念的。

二、泛型類(lèi)的定義-類(lèi)型邊界

泛型還有一個(gè)點(diǎn)就是:泛型的上界。(類(lèi)型形參 extends 類(lèi)型邊界)有如下代碼:

public class Algorithm<T extends Comparable<T>> {
    public T findMax(T[] array) {
    
	}
}

以上代碼中,方法的作用就是傳遞一個(gè)數(shù)組進(jìn)去,要求返回這個(gè)數(shù)組中的最大值。

這個(gè)時(shí)候問(wèn)題就來(lái)了,泛型是T類(lèi)型,當(dāng)調(diào)用這個(gè)方法的時(shí)候,傳遞過(guò)去的參數(shù)類(lèi)型不一定就是簡(jiǎn)單數(shù)據(jù)類(lèi)型啊。那么這個(gè)時(shí)候該怎么進(jìn)行判斷大小呢???

此時(shí)這樣的泛型寫(xiě)法的作用就是:T extends Comparable, 就叫做泛型的上界,當(dāng)傳遞參數(shù)類(lèi)型的時(shí)候,必須傳遞過(guò)去的參數(shù)類(lèi)型必須是實(shí)現(xiàn)了Comparable接口的類(lèi)型才可以。換句話說(shuō),傳遞過(guò)去的類(lèi)型必須是可以進(jìn)行比較的。

當(dāng)我們自己定義的一個(gè)類(lèi)Node,然后實(shí)現(xiàn)Comparable接口,就能調(diào)用如上的方法。

切記,這樣寫(xiě)的泛型,傳遞過(guò)去的參數(shù)類(lèi)型,必須是實(shí)現(xiàn)了Comparable接口的,當(dāng)然也可以傳遞Comparable接口本身。

三、類(lèi)型擦除

類(lèi)型擦除值得是:代碼編譯后,會(huì)將泛型T,全部擦除為Object類(lèi)型。如下代碼:

ArrayList<Integer> list = new ArrayList<>();

上面這一行代碼,雖然此時(shí)寫(xiě)的是Integer類(lèi)型的,但是在編譯之后,JVM會(huì)自動(dòng)地將Integer擦除為Object。即就是這樣子的:ArrayList。

那么可能就會(huì)有同學(xué)疑惑了,反正都要被擦除為Object類(lèi)型,那干嘛還需要泛型這個(gè)東西???

那是因?yàn)橛辛朔盒停梢宰尨a在編譯的時(shí)候,進(jìn)行類(lèi)型的檢查,就像上面的代碼,寫(xiě)的是Integer類(lèi)型的,那么傳遞過(guò)去的參數(shù)類(lèi)型就必須是Integer類(lèi)型才能通過(guò)編譯。做到了類(lèi)型檢查,且在使用get方法,獲取某一個(gè)數(shù)值的時(shí)候,也會(huì)自動(dòng)地將數(shù)據(jù)從Object轉(zhuǎn)換為Integer類(lèi)型的。

以上的全部,只是解釋了只寫(xiě)T類(lèi)型的擦除機(jī)制。那么使用泛型的上界的話,JVM就不會(huì)直接擦除為Object類(lèi)型了,而是上界是什么類(lèi)型,就擦除為什么類(lèi)型即可。比如

public class Algorithm<T extends Comparable<T>> {
    
}

如上的代碼,上界是Comparable接口,那么這個(gè)代碼形參部分,最多也只是這個(gè)接口了,也就是說(shuō),天花板就是這個(gè)接口。那么此時(shí)JVM在擦除的時(shí)候,直接擦除為Comparable接口類(lèi)型即可。

總結(jié):類(lèi)型擦除,主要還是要看類(lèi)型的邊界。

四、泛型類(lèi)的使用-通配符

在泛型中,?稱為通配符。有如下代碼:

public class MyArrayList<E> {
    //自定義的一個(gè)類(lèi)
}

//main方法中的一個(gè)普通方法
public static void printAll(MyArrayList<?> list) {
    //打印傳遞過(guò)來(lái)的參數(shù)list
}

以上代碼,可能大家看起來(lái)會(huì)怪怪的。簡(jiǎn)單分析一下:

MyArrayList類(lèi)型,是程序員自定義的一個(gè)類(lèi),采用了泛型。

而printAll方法,需要打印MyArrayList的數(shù)據(jù),但是MyArrayList是一個(gè)獨(dú)立的java文件,而printAll方法是在main方法中。二者并沒(méi)有任何聯(lián)系。那么此時(shí)在調(diào)用printAll時(shí),形參部分就沒(méi)法進(jìn)行定義了。

此時(shí)的話,就只能使用MyArrayList<?>類(lèi)型作為形參部分,這樣定義的話,此時(shí)傳遞什么類(lèi)型的MyArrayList,printAll方法都能夠進(jìn)行接收。

有如下調(diào)用代碼:

public static void main(String[] args) {
    MyArrayList<String> list1 = new MyArrayList<>();
    MyArrayList<Integer> list2 = new MyArrayList<>();
    MyArrayList<Double> list3 = new MyArrayList<>();
    
    printAll(list1); //String類(lèi)型
    printAll(list2); //Integer類(lèi)型
    printAll(list3); //Double類(lèi)型
}

以上代碼,在運(yùn)行的時(shí)候就不會(huì)報(bào)錯(cuò)了。printAll方法,能夠接收所有類(lèi)型的MyArrayList類(lèi)的實(shí)例對(duì)象。

通配符的上界:<? extends 上界>

public static void printAll(MyArrayList<? extends Number> list) {
    
}

如上代碼,是在原來(lái)代碼的基礎(chǔ)之上,添加了上界。原先的代碼是可以接收任何類(lèi)型的MyArrayList實(shí)例對(duì)象。這里加了上界后,表示此時(shí)這個(gè)方法只能接收這個(gè)上界類(lèi)型,以及上界的所有子類(lèi)類(lèi)型。

就拿上面這個(gè)代碼來(lái)說(shuō),上界是Number類(lèi)型,那么此時(shí)這個(gè)printAll方法能夠接收的形參類(lèi)型就只能是Number或者Number的子類(lèi)類(lèi)型。

public static void main(String[] args) {
    MyArrayList<String> list1 = new MyArrayList<>();
    MyArrayList<Integer> list2 = new MyArrayList<>();
    MyArrayList<Double> list3 = new MyArrayList<>();
    
    //printAll(list1); 
    //String類(lèi)型,此時(shí)String類(lèi)型就會(huì)報(bào)錯(cuò),因?yàn)镾tring不是Number的子類(lèi)
    
    printAll(list2); //Integer類(lèi)型
    printAll(list3); //Double類(lèi)型
}

如上代碼,String類(lèi)型的MyArrayList,調(diào)用printAll方法,就會(huì)報(bào)錯(cuò),因?yàn)镾tring不是Number類(lèi)的子類(lèi)。

同理有了通配符的上界,那么也有通配符的下界。

通配符的下界:<? super 下界>

public static void printAll(MyArrayList<? super Integer> list) {
    
}

同理,此時(shí)傳遞過(guò)去的MyArrayList實(shí)例對(duì)象的類(lèi)型,只能是Integer類(lèi)型,或者是Integer類(lèi)型的父類(lèi)。

public static void main(String[] args) {
    MyArrayList<String> list1 = new MyArrayList<>();
    MyArrayList<Integer> list2 = new MyArrayList<>();
    MyArrayList<Double> list3 = new MyArrayList<>();
    MyArrayList<Number> list4 = new MyArrayList<>(); 
    MyArrayList<Object> list5 = new MyArrayList<>();
    
    //printAll(list1); 
    //此時(shí)String類(lèi)型就會(huì)報(bào)錯(cuò),因?yàn)镾tring的父類(lèi)并不是Integer
    
    printAll(list3); //Double類(lèi)型
    //此時(shí)Double類(lèi)型也會(huì)報(bào)錯(cuò),Double類(lèi)型的父類(lèi)并不是Integer
    
    printAll(list2); //Integer類(lèi)型
    printAll(list4); //Number類(lèi)型
    printAll(list5); //Object類(lèi)型,是所有類(lèi)的父類(lèi)
}

以上代碼,就是通配符的下界。傳遞的參數(shù)類(lèi)型,只能是該下界或者是下界的父類(lèi)。

五、泛型方法

除了泛型類(lèi),還有一個(gè)泛型方法的概念。比較以下兩個(gè)代碼:

//泛型類(lèi)的寫(xiě)法
public class Algorithm<T extends Comparable<T>> {
    public T findMax(T[] array) {
    
	}
}

此時(shí)我想把findMax方法,寫(xiě)成靜態(tài)的。寫(xiě)成靜態(tài)之后,這個(gè)方法就不依賴于對(duì)象了,只需要通過(guò)類(lèi)名就能進(jìn)行調(diào)用,可能你會(huì)覺(jué)得這還不簡(jiǎn)單,你就寫(xiě)下了以下代碼:

//猜想你會(huì)寫(xiě)如下代碼--錯(cuò)誤寫(xiě)法
public class Algorithm<T extends Comparable<T>> {
    public static T findMax(T[] array) {
    
	}
} 

上面寫(xiě)的代碼,肯定是不對(duì)的。正確的寫(xiě)法如下:

//靜態(tài)方法的正確寫(xiě)法
public class Algorithm {
    public static<T extends Comparable<T>> T findMax(T[] array) {
    
	}
}

如上代碼,既然是寫(xiě)泛型方法,我們只需將原先寫(xiě)在類(lèi)名后面的泛型,寫(xiě)在static關(guān)鍵字后面即可。這樣寫(xiě)就是一個(gè)泛型方法。

六、泛型的限制

  • 泛型類(lèi)型不支持基本數(shù)據(jù)類(lèi)型,只能傳遞基本數(shù)據(jù)類(lèi)型的包裝類(lèi)
  • 無(wú)法實(shí)例化泛型類(lèi)型的對(duì)象。(比如new T)
  • 無(wú)法使用泛型類(lèi)型聲明靜態(tài)的屬性
  • 無(wú)法使用instanceof判斷帶類(lèi)型參數(shù)的泛型類(lèi)型
  • 無(wú)法創(chuàng)建泛型類(lèi)的數(shù)組。(只能new Object[],然后強(qiáng)轉(zhuǎn))
  • 無(wú)法create、catch、throw一個(gè)泛型類(lèi)異常(異常不支持泛型)
  • 泛型類(lèi)型不是形參的一部分,無(wú)法重載

好啦,本期更新就到此結(jié)束啦,我們下期見(jiàn)吧?。?!

到此這篇關(guān)于Java 泛型詳解與范例的文章就介紹到這了,更多相關(guān)Java 泛型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文詳解Java二分查找算法

    一文詳解Java二分查找算法

    二分查找(binary search),也稱折半搜索,是一種在有序數(shù)組中查找某一特定元素的搜索算法,接下來(lái)就來(lái)給大家講講都有哪些查找算法,以及經(jīng)典的二分查找法該如何實(shí)現(xiàn),需要的朋友可以參考下
    2023-07-07
  • Spring Cloud Stream 高級(jí)特性使用詳解

    Spring Cloud Stream 高級(jí)特性使用詳解

    這篇文章主要為大家介紹了Spring Cloud Stream 高級(jí)特性使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Java實(shí)現(xiàn)視頻初步壓縮和解壓的代碼示例

    Java實(shí)現(xiàn)視頻初步壓縮和解壓的代碼示例

    從攝像頭讀取每一幀的圖片,用一些簡(jiǎn)單的方法將多張圖片信息壓縮到一份文件中(自定義的視頻文件),自定義解碼器讀取視頻文件,并將每幀圖片展示成視頻,本文主要介紹了Java實(shí)現(xiàn)視頻初步壓縮和解壓,需要的朋友可以參考下
    2023-10-10
  • IDEA中SpringBoot項(xiàng)目數(shù)據(jù)庫(kù)連接加密方法

    IDEA中SpringBoot項(xiàng)目數(shù)據(jù)庫(kù)連接加密方法

    這篇文章主要介紹了IDEA中SpringBoot項(xiàng)目數(shù)據(jù)庫(kù)連接加密方法,文章通過(guò)圖文結(jié)合的方式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-06-06
  • SpringBoot如何統(tǒng)一配置bean的別名

    SpringBoot如何統(tǒng)一配置bean的別名

    這篇文章主要介紹了SpringBoot如何統(tǒng)一配置bean的別名,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • java分布式緩存方案

    java分布式緩存方案

    本文簡(jiǎn)單介紹了緩存的種類(lèi),緩存常見(jiàn)的問(wèn)題,對(duì)大家的學(xué)習(xí)和工作有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2021-08-08
  • MyBatis中$和#的深入講解

    MyBatis中$和#的深入講解

    這篇文章主要給大家介紹了關(guān)于MyBatis中$和#的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • java內(nèi)部類(lèi)的定義與分類(lèi)示例詳解

    java內(nèi)部類(lèi)的定義與分類(lèi)示例詳解

    這篇文章主要給大家介紹了關(guān)于java內(nèi)部類(lèi)的定義與分類(lèi)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • java使用Jco連接SAP過(guò)程

    java使用Jco連接SAP過(guò)程

    這篇文章主要介紹了java使用Jco連接SAP過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Gateway如何實(shí)現(xiàn)全局跨域

    Gateway如何實(shí)現(xiàn)全局跨域

    這篇文章主要介紹了Gateway如何實(shí)現(xiàn)全局跨域問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04

最新評(píng)論

潜山县| 夏邑县| 镇坪县| 望奎县| 余江县| 崇明县| 鞍山市| 郑州市| 东港市| 车险| 镇安县| 安宁市| 英山县| 建湖县| 深水埗区| 石河子市| 麦盖提县| 阳新县| 玉田县| 金堂县| 大同县| 稻城县| 阿巴嘎旗| 临湘市| 阿克苏市| 文成县| 酒泉市| 闽侯县| 土默特左旗| 兴国县| 百色市| 玉树县| 中超| 溧水县| 潜山县| 阳新县| 美姑县| 留坝县| 中超| 石林| 昌图县|