黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學(xué)習(xí)攻略 講解最詳細(xì)的Java泛型類的使用

講解最詳細(xì)的Java泛型類的使用

更新時間:2019-10-24 14:28:52 來源:動力節(jié)點 瀏覽2765次



對java的泛型特性的了解僅限于表面的淺淺一層,直到在學(xué)習(xí)設(shè)計模式時發(fā)現(xiàn)有不了解的用法,才想起詳細(xì)的記錄一下。本文參考java 泛型詳解、Java中的泛型方法、 java泛型詳解

概述

泛型在java中有很重要的地位,在面向?qū)ο缶幊碳案鞣N設(shè)計模式中有非常廣泛的應(yīng)用。什么是泛型?為什么要使用泛型?

泛型,即“參數(shù)化類型”。一提到參數(shù),最熟悉的就是定義方法時有形參,然后調(diào)用此方法時傳遞實參。那么參數(shù)化類型怎么理解呢?顧名思義,就是將類型由原來的具體的類型參數(shù)化,類似于方法中的變量參數(shù),此時類型也定義成參數(shù)形式(可以稱之為類型形參),然后在使用/調(diào)用時傳入具體的類型(類型實參)。泛型的本質(zhì)是為了參數(shù)化類型(在不創(chuàng)建新的類型的情況下,通過泛型指定的不同類型來控制形參具體限制的類型)。也就是說在泛型使用過程中,操作的數(shù)據(jù)類型被指定為一個參數(shù),這種參數(shù)類型可以用在類、接口和方法中,分別被稱為泛型類、泛型接口、泛型方法。

一個栗子

一個被舉了無數(shù)次的例子:

java 泛型詳解-絕對是對泛型方法講解最詳細(xì)的,沒有之一


毫無疑問,程序的運行結(jié)果會以崩潰結(jié)束:

java 泛型詳解-絕對是對泛型方法講解最詳細(xì)的,沒有之一


ArrayList可以存放任意類型,例子中添加了一個String類型,添加了一個Integer類型,再使用時都以String的方式使用,因此程序崩潰了。為了解決類似這樣的問題(在編譯階段就可以解決),泛型應(yīng)運而生。

我們將第一行聲明初始化list的代碼更改一下,編譯器會在編譯階段就能夠幫我們發(fā)現(xiàn)類似這樣的問題。

java 泛型詳解-絕對是對泛型方法講解最詳細(xì)的,沒有之一


特性

泛型只在編譯階段有效。看下面的代碼:

java 泛型詳解-絕對是對泛型方法講解最詳細(xì)的,沒有之一


輸出結(jié)果:D/泛型測試: 類型相同。

通過上面的例子可以證明,在編譯之后程序會采取去泛型化的措施。也就是說Java中的泛型,只在編譯階段有效。在編譯過程中,正確檢驗泛型結(jié)果后,會將泛型的相關(guān)信息擦出,并且在對象進(jìn)入和離開方法的邊界處添加類型檢查和類型轉(zhuǎn)換的方法。也就是說,泛型信息不會進(jìn)入到運行時階段。

對此總結(jié)成一句話:泛型類型在邏輯上看以看成是多個不同的類型,實際上都是相同的基本類型。

泛型的使用

泛型有三種使用方式,分別為:泛型類、泛型接口、泛型方法

泛型類

泛型類型用于類的定義中,被稱為泛型類。通過泛型可以完成對一組類的操作對外開放相同的接口。最典型的就是各種容器類,如:List、Set、Map。

泛型類的最基本寫法(這么看可能會有點暈,會在下面的例子中詳解):

java 泛型詳解-絕對是對泛型方法講解最詳細(xì)的,沒有之一


一個最普通的泛型類:

//此處T可以隨便寫為任意標(biāo)識,常見的如T、E、K、V等形式的參數(shù)常用于表示泛型 //在實例化泛型類時,必須指定T的具體類型

java 泛型詳解-絕對是對泛型方法講解最詳細(xì)的,沒有之一


定義的泛型類,就一定要傳入泛型類型實參么?并不是這樣,在使用泛型的時候如果傳入泛型實參,則會根據(jù)傳入的泛型實參做相應(yīng)的限制,此時泛型才會起到本應(yīng)起到的限制作用。如果不傳入泛型類型實參的話,在泛型類中使用泛型的方法或成員變量定義的類型可以為任何的類型。

看一個例子:

java 泛型詳解-絕對是對泛型方法講解最詳細(xì)的,沒有之一


注意:

  • 泛型的類型參數(shù)只能是類類型,不能是簡單類型。

  • 不能對確切的泛型類型使用instanceof操作。如下面的操作是非法的,編譯時會出錯。

java 泛型詳解-絕對是對泛型方法講解最詳細(xì)的,沒有之一


泛型接口

泛型接口與泛型類的定義及使用基本相同。泛型接口常被用在各種類的生產(chǎn)器中,可以看一個例子:

java 泛型詳解-絕對是對泛型方法講解最詳細(xì)的,沒有之一


當(dāng)實現(xiàn)泛型接口的類,未傳入泛型實參時:

java 泛型詳解-絕對是對泛型方法講解最詳細(xì)的,沒有之一


當(dāng)實現(xiàn)泛型接口的類,傳入泛型實參時:

java 泛型詳解-絕對是對泛型方法講解最詳細(xì)的,沒有之一


泛型通配符

我們知道Ingeter是Number的一個子類,同時在特性章節(jié)中我們也驗證過Generic與Generic實際上是相同的一種基本類型。那么問題來了,在使用Generic作為形參的方法中,能否使用Generic的實例傳入呢?在邏輯上類似于Generic和Generic是否可以看成具有父子關(guān)系的泛型類型呢?

為了弄清楚這個問題,我們使用Generic這個泛型類繼續(xù)看下面的例子:

java 泛型詳解-絕對是對泛型方法講解最詳細(xì)的,沒有之一


通過提示信息我們可以看到Generic不能被看作為`Generic的子類。由此可以看出:同一種泛型可以對應(yīng)多個版本(因為參數(shù)類型是不確定的),不同版本的泛型類實例是不兼容的。

回到上面的例子,如何解決上面的問題?總不能為了定義一個新的方法來處理Generic類型的類,這顯然與java中的多臺理念相違背。因此我們需要一個在邏輯上可以表示同時是Generic和Generic父類的引用類型。由此類型通配符應(yīng)運而生。

我們可以將上面的方法改一下:

java 泛型詳解-絕對是對泛型方法講解最詳細(xì)的,沒有之一


類型通配符一般是使用?代替具體的類型實參,注意了,此處’?’是類型實參,而不是類型形參 。重要說三遍!此處’?’是類型實參,而不是類型形參 ! 此處’?’是類型實參,而不是類型形參 !再直白點的意思就是,此處的?和Number、String、Integer一樣都是一種實際的類型,可以把?看成所有類型的父類。是一種真實的類型。

可以解決當(dāng)具體類型不確定的時候,這個通配符就是 ?;當(dāng)操作類型時,不需要使用類型的具體功能時,只使用Object類中的功能。那么可以用 ? 通配符來表未知類型。

泛型方法

在java中,泛型類的定義非常簡單,但是泛型方法就比較復(fù)雜了。

尤其是我們見到的大多數(shù)泛型類中的成員方法也都使用了泛型,有的甚至泛型類中也包含著泛型方法,這樣在初學(xué)者中非常容易將泛型方法理解錯了。

泛型類,是在實例化類的時候指明泛型的具體類型;泛型方法,是在調(diào)用方法的時候指明泛型的具體類型 。

java 泛型詳解-絕對是對泛型方法講解最詳細(xì)的,沒有之一


泛型方法的基本用法

光看上面的例子有的同學(xué)可能依然會非常迷糊,我們再通過一個例子,把我泛型方法再總結(jié)一下。

java 泛型詳解-絕對是對泛型方法講解最詳細(xì)的,沒有之一


java 泛型詳解-絕對是對泛型方法講解最詳細(xì)的,沒有之一


類中的泛型方法

當(dāng)然這并不是泛型方法的全部,泛型方法可以出現(xiàn)雜任何地方和任何場景中使用。但是有一種情況是非常特殊的,當(dāng)泛型方法出現(xiàn)在泛型類中時,我們再通過一個例子看一下

java 泛型詳解-絕對是對泛型方法講解最詳細(xì)的,沒有之一


java 泛型詳解-絕對是對泛型方法講解最詳細(xì)的,沒有之一


泛型方法與可變參數(shù)

再看一個泛型方法和可變參數(shù)的例子:

java 泛型詳解-絕對是對泛型方法講解最詳細(xì)的,沒有之一


靜態(tài)方法與泛型

靜態(tài)方法有一種情況需要注意一下,那就是在類中的靜態(tài)方法使用泛型:靜態(tài)方法無法訪問類上定義的泛型;如果靜態(tài)方法操作的引用數(shù)據(jù)類型不確定的時候,必須要將泛型定義在方法上。

即:如果靜態(tài)方法要使用泛型的話,必須將靜態(tài)方法也定義成泛型方法 。

java 泛型詳解-絕對是對泛型方法講解最詳細(xì)的,沒有之一


泛型方法總結(jié)

泛型方法能使方法獨立于類而產(chǎn)生變化,以下是一個基本的指導(dǎo)原則:

無論何時,如果你能做到,你就該盡量使用泛型方法。也就是說,如果使用泛型方法將整個類泛型化,那么就應(yīng)該使用泛型方法。另外對于一個static的方法而已,無法訪問泛型類型的參數(shù)。所以如果static方法要使用泛型能力,就必須使其成為泛型方法。

泛型上下邊界

在使用泛型的時候,我們還可以為傳入的泛型類型實參進(jìn)行上下邊界的限制,如:類型實參只準(zhǔn)傳入某種類型的父類或某種類型的子類。

為泛型添加上邊界,即傳入的類型實參必須是指定類型的子類型

java 泛型詳解-絕對是對泛型方法講解最詳細(xì)的,沒有之一


如果我們把泛型類的定義也改一下:

java 泛型詳解-絕對是對泛型方法講解最詳細(xì)的,沒有之一


//這一行代碼也會報錯,因為String不是Number的子類

java 泛型詳解-絕對是對泛型方法講解最詳細(xì)的,沒有之一


再來一個泛型方法的例子:

java 泛型詳解-絕對是對泛型方法講解最詳細(xì)的,沒有之一


通過上面的兩個例子可以看出:泛型的上下邊界添加,必須與泛型的聲明在一起 。

關(guān)于泛型數(shù)組要提一下

看到了很多文章中都會提起泛型數(shù)組,經(jīng)過查看sun的說明文檔,在java中是”不能創(chuàng)建一個確切的泛型類型的數(shù)組”的。

也就是說下面的這個例子是不可以的:

java 泛型詳解-絕對是對泛型方法講解最詳細(xì)的,沒有之一


而使用通配符創(chuàng)建泛型數(shù)組是可以的,如下面這個例子:

java 泛型詳解-絕對是對泛型方法講解最詳細(xì)的,沒有之一


這樣也是可以的:

java 泛型詳解-絕對是對泛型方法講解最詳細(xì)的,沒有之一


下面使用Sun的一篇文檔的一個例子來說明這個問題:

java 泛型詳解-絕對是對泛型方法講解最詳細(xì)的,沒有之一


這種情況下,由于JVM泛型的擦除機制,在運行時JVM是不知道泛型信息的,所以可以給oa[1]賦上一個ArrayList而不會出現(xiàn)異常,但是在取出數(shù)據(jù)的時候卻要做一次類型轉(zhuǎn)換,所以就會出現(xiàn)ClassCastException,如果可以進(jìn)行泛型數(shù)組的聲明,上面說的這種情況在編譯期將不會出現(xiàn)任何的警告和錯誤,只有在運行時才會出錯。

而對泛型數(shù)組的聲明進(jìn)行限制,對于這樣的情況,可以在編譯期提示代碼有類型安全問題,比沒有任何提示要強很多。

下面采用通配符的方式是被允許的:數(shù)組的類型不可以是類型變量,除非是采用通配符的方式,因為對于通配符的方式,最后取出數(shù)據(jù)是要做顯式的類型轉(zhuǎn)換的。

java 泛型詳解-絕對是對泛型方法講解最詳細(xì)的,沒有之一


最后

本文中的例子主要是為了闡述泛型中的一些思想而簡單舉出的,并不一定有著實際的可用性。另外,一提到泛型,相信大家用到最多的就是在集合中,其實,在實際的編程過程中,自己可以使用泛型去簡化開發(fā),且能很好的保證代碼質(zhì)量。

以上就是動力節(jié)點java培訓(xùn)機構(gòu)小編介紹的“講解最詳細(xì)的Java泛型類的使用”的內(nèi)容,希望對大家有幫助,更多java最新資訊請繼續(xù)關(guān)注動力節(jié)點java培訓(xùn)機構(gòu)官網(wǎng),每天會有精彩內(nèi)容分享與你。


提交申請后,顧問老師會電話與您溝通安排學(xué)習(xí)

免費課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 看片视频在线观看 | 国产黄色毛片 | 久久中文字幕一区二区三区 | 欧美三级欧美做a爱 | 国产亚洲欧美日韩综合另类 | 在线播放国产一区二区三区 | 国产亚洲欧洲 | 免费黄色小视频在线观看 | 成人免费在线播放视频 | 久久精品国产曰本波多野结衣 | 天天做天天爱天天做天天吃中 | 亚洲精品网站在线观看不卡无广告 | 国产精品福利在线观看秒播 | 久久制服丝袜 | 污视频网站在线免费看 | 日批视频在线免费观看 | 免费人成网站7777视频 | 亚洲国产欧美国产综合一区 | 日韩啪| 制服诱惑中文字幕 | 午夜特片网 | 日本xxxxx黄区免费看动漫 | 亚洲第一网站 | 青青草国产精品欧美成人 | 亚洲综合激情小说 | 中文字幕丝袜 | 午夜爽爽性刺激一区二区视频 | 亚洲天堂视频在线免费观看 | 国产后式a一视频 | 久久综合五月天婷婷伊人 | 国产一区二区三区在线影院 | 天天操操操操操 | 2019中文字幕视频 | 99re热视频| 日本免费一二区视频 | 香蕉视频a级片 | 国产精品免费一区二区三区 | 欧美a站| 韩国18videos极品| 最近更新2019中文国语字幕 | 日韩中文字幕视频在线观看 |