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

初步理解Java的泛型特性

 更新時(shí)間:2015年11月23日 08:54:14   作者:phoenix007  
這篇文章主要介紹了Java的泛型特性,是Java入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下

在Java SE1.5中,增加了一個(gè)新的特性:泛型(日本語(yǔ)中的總稱(chēng)型)。何謂泛型呢?通俗的說(shuō),就是泛泛的指定對(duì)象所操作的類(lèi)型,而不像常規(guī)方式一樣使用某種固定的類(lèi)型去指定。泛型的本質(zhì)就是將所操作的數(shù)據(jù)類(lèi)型參數(shù)化,也就是說(shuō),該數(shù)據(jù)類(lèi)型被指定為一個(gè)參數(shù)。這種參數(shù)類(lèi)型可以使用在類(lèi)、接口以及方法定義中。
 
一、為什么使用泛型呢?
     在以往的J2SE中,沒(méi)有泛型的情況下,通常是使用Object類(lèi)型來(lái)進(jìn)行多種類(lèi)型數(shù)據(jù)的操作。這個(gè)時(shí)候操作最多的就是針對(duì)該Object進(jìn)行數(shù)據(jù)的強(qiáng)制轉(zhuǎn)換,而這種轉(zhuǎn)換是基于開(kāi)發(fā)者對(duì)該數(shù)據(jù)類(lèi)型明確的情況下進(jìn)行的(比如將Object型轉(zhuǎn)換為String型)。倘若類(lèi)型不一致,編譯器在編譯過(guò)程中不會(huì)報(bào)錯(cuò),但在運(yùn)行時(shí)會(huì)出錯(cuò)。
    使用泛型的好處在于,它在編譯的時(shí)候進(jìn)行類(lèi)型安全檢查,并且在運(yùn)行時(shí)所有的轉(zhuǎn)換都是強(qiáng)制的,隱式的,大大提高了代碼的重用率。
 
二、定義&使用
 類(lèi)型參數(shù)的命名風(fēng)格為:
 推薦你用簡(jiǎn)練的名字作為形式類(lèi)型參數(shù)的名字(如果可能,單個(gè)字符)。最好避免小寫(xiě)字母,這使它和其他的普通
 的形式參數(shù)很容易被區(qū)分開(kāi)來(lái)。
 使用T代表類(lèi)型,無(wú)論何時(shí)都沒(méi)有比這更具體的類(lèi)型來(lái)區(qū)分它。這經(jīng)常見(jiàn)于泛型方法。如果有多個(gè)類(lèi)型參數(shù),我們
 可能使用字母表中T的臨近的字母,比如S。
 如果一個(gè)泛型函數(shù)在一個(gè)泛型類(lèi)里面出現(xiàn),最好避免在方法的類(lèi)型參數(shù)和類(lèi)的類(lèi)型參數(shù)中使用同樣的名字來(lái)避免混
 淆。對(duì)內(nèi)部類(lèi)也是同樣。
 
1.定義帶類(lèi)型參數(shù)的類(lèi)
 在定義帶類(lèi)型參數(shù)的類(lèi)時(shí),在緊跟類(lèi)命之后的<>內(nèi),指定一個(gè)或多個(gè)類(lèi)型參數(shù)的名字,同時(shí)也可以對(duì)類(lèi)型參數(shù)的取
 值范圍進(jìn)行限定,多個(gè)類(lèi)型參數(shù)之間用,號(hào)分隔。
 定義完類(lèi)型參數(shù)后,可以在定義位置之后的類(lèi)的幾乎任意地方(靜態(tài)塊,靜態(tài)屬性,靜態(tài)方法除外)使用類(lèi)型參數(shù),
 就像使用普通的類(lèi)型一樣。
 注意,父類(lèi)定義的類(lèi)型參數(shù)不能被子類(lèi)繼承。

 public class TestClassDefine<T, S extends T> {
   .... 
 }

 
2.定義待類(lèi)型參數(shù)方法
 在定義帶類(lèi)型參數(shù)的方法時(shí),在緊跟可見(jiàn)范圍修飾(例如public)之后的<>內(nèi),指定一個(gè)或多個(gè)類(lèi)型參數(shù)的名字,
 同時(shí)也可以對(duì)類(lèi)型參數(shù)的取值范圍進(jìn)行限定,多個(gè)類(lèi)型參數(shù)之間用,號(hào)分隔。
 定義完類(lèi)型參數(shù)后,可以在定義位置之后的方法的任意地方使用類(lèi)型參數(shù),就像使用普通的類(lèi)型一樣。
 例如:

 public <T, S extends T> T testGenericMethodDefine(T t, S s){
   ...
 }

 注意:定義帶類(lèi)型參數(shù)的方法,騎主要目的是為了表達(dá)多個(gè)參數(shù)以及返回值之間的關(guān)系。例如本例子中T和S的繼
 承關(guān)系, 返回值的類(lèi)型和第一個(gè)類(lèi)型參數(shù)的值相同。
 如果僅僅是想實(shí)現(xiàn)多態(tài),請(qǐng)優(yōu)先使用通配符解決。通配符的內(nèi)容見(jiàn)下面章節(jié)。

 public <T> void testGenericMethodDefine2(List<T> s){
   ...
 }

 應(yīng)改為

 public void testGenericMethodDefine2(List<?> s){
   ...
 }

 
3. 類(lèi)型參數(shù)賦值
 當(dāng)對(duì)類(lèi)或方法的類(lèi)型參數(shù)進(jìn)行賦值時(shí),要求對(duì)所有的類(lèi)型參數(shù)進(jìn)行賦值。否則,將得到一個(gè)編譯錯(cuò)誤。
 
4.對(duì)帶類(lèi)型參數(shù)的類(lèi)進(jìn)行類(lèi)型參數(shù)賦值
 對(duì)帶類(lèi)型參數(shù)的類(lèi)進(jìn)行類(lèi)型參數(shù)賦值有兩種方式
 第一聲明類(lèi)變量或者實(shí)例化時(shí)。例如

 List<String> list;
 list = new ArrayList<String>;

 第二繼承類(lèi)或者實(shí)現(xiàn)接口時(shí)。例如

 public class MyList<E> extends ArrayList<E> implements List<E> {...} 

 
5.對(duì)帶類(lèi)型參數(shù)方法進(jìn)行賦值
 當(dāng)調(diào)用范型方法時(shí),編譯器自動(dòng)對(duì)類(lèi)型參數(shù)進(jìn)行賦值,當(dāng)不能成功賦值時(shí)報(bào)編譯錯(cuò)誤。例如

 public <T> T testGenericMethodDefine3(T t, List<T> list){
   ...
 }
 public <T> T testGenericMethodDefine4(List<T> list1, List<T> list2){
   ...
 }
 
 Number n = null;
 Integer i = null;
 Object o = null;
 testGenericMethodDefine(n, i);//此時(shí)T為Number, S為Integer
 testGenericMethodDefine(o, i);//T為Object, S為Integer
 
 List<Number> list1 = null;
 testGenericMethodDefine3(i, list1)//此時(shí)T為Number
 
 List<Integer> list2 = null;
 testGenericMethodDefine4(list1, list2)//編譯報(bào)錯(cuò)

 
6.通配符
 在上面兩小節(jié)中,對(duì)是類(lèi)型參數(shù)賦予具體的值,除此,還可以對(duì)類(lèi)型參數(shù)賦予不確定值。例如

 List<?> unknownList;
 List<? extends Number> unknownNumberList;
 List<? super Integer> unknownBaseLineIntgerList; 

 注意: 在Java集合框架中,對(duì)于參數(shù)值是未知類(lèi)型的容器類(lèi),只能讀取其中元素,不能像其中添加元素,
 因?yàn)椋漕?lèi)型是未知,所以編譯器無(wú)法識(shí)別添加元素的類(lèi)型和容器的類(lèi)型是否兼容,唯一的例外是NULL

 List<String> listString;
 List<?> unknownList2 = listString;
 unknownList = unknownList2;
 listString = unknownList;//編譯錯(cuò)誤

 
7.數(shù)組范型
 可以使用帶范型參數(shù)值的類(lèi)聲明數(shù)組,卻不可有創(chuàng)建數(shù)組

 List<Integer>[] iListArray;
 new ArrayList<Integer>[10];//編譯時(shí)錯(cuò)誤

 
三、擴(kuò)展
1、extends語(yǔ)句
使用extends語(yǔ)句將限制泛型參數(shù)的適用范圍。例如:
<T extends collection> ,則表示該泛型參數(shù)的使用范圍是所有實(shí)現(xiàn)了collection接口的calss。如果傳入一個(gè)<String>則程序編譯出錯(cuò)。
2、super語(yǔ)句
super語(yǔ)句的作用與extends一樣,都是限制泛型參數(shù)的適用范圍。區(qū)別在于,super是限制泛型參數(shù)只能是指定該class的上層父類(lèi)。
例如<T super List>,表示該泛型參數(shù)只能是List和List的上層父類(lèi)。
3、通配符
使用通配符的目的是為了解決泛型參數(shù)被限制死了不能動(dòng)態(tài)根據(jù)實(shí)例來(lái)確定的缺點(diǎn)。
舉個(gè)例子:public class SampleClass < T extends S> {…}
假如A,B,C,…Z這26個(gè)class都實(shí)現(xiàn)了S接口。我們使用時(shí)需要使用到這26個(gè)class類(lèi)型的泛型參數(shù)。那實(shí)例化的時(shí)候怎么辦呢?依次寫(xiě)下

SampleClass<A> a = new SampleClass();
SampleClass<B> a = new SampleClass();
…
SampleClass<Z> a = new SampleClass();

這顯然很冗余,還不如使用Object而不使用泛型,呵呵,是吧?
別著急,咱們使用通配符,就OK了。

SampleClass<? Extends S> sc = new SampleClass();

 
只需要聲明一個(gè)sc變量,很方便把!

相關(guān)文章

  • java中流的使用

    java中流的使用

    本文主要介紹了java中流的使用以及分類(lèi)。具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-01-01
  • SpringBoot自動(dòng)裝配原理詳解

    SpringBoot自動(dòng)裝配原理詳解

    這篇文章主要詳細(xì)介紹了SpringBoot的自動(dòng)裝配原理,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考一下
    2023-04-04
  • mybatis-generator-gui根據(jù)需求改動(dòng)示例

    mybatis-generator-gui根據(jù)需求改動(dòng)示例

    這篇文章主要為大家介紹了mybatis-generator-gui根據(jù)需求改動(dòng)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • mybatis返回key value map集合方式

    mybatis返回key value map集合方式

    這篇文章主要介紹了mybatis返回key value map集合方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • SpringBoot整合阿里云OSS對(duì)象存儲(chǔ)服務(wù)的實(shí)現(xiàn)

    SpringBoot整合阿里云OSS對(duì)象存儲(chǔ)服務(wù)的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot整合阿里云OSS對(duì)象存儲(chǔ)服務(wù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Spring data jpa的使用與詳解(復(fù)雜動(dòng)態(tài)查詢(xún)及分頁(yè),排序)

    Spring data jpa的使用與詳解(復(fù)雜動(dòng)態(tài)查詢(xún)及分頁(yè),排序)

    這篇文章主要介紹了Spring data jpa的使用與詳解(復(fù)雜動(dòng)態(tài)查詢(xún)及分頁(yè),排序),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 解讀List?list=new?ArrayList()是怎么回事

    解讀List?list=new?ArrayList()是怎么回事

    這篇文章主要介紹了解讀List?list=new?ArrayList()是怎么回事,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 使用eclipse創(chuàng)建java項(xiàng)目的方法

    使用eclipse創(chuàng)建java項(xiàng)目的方法

    這篇文章主要為大家詳細(xì)介紹了使用eclipse創(chuàng)建java項(xiàng)目的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • springboot整合mybatis分頁(yè)攔截器的問(wèn)題小結(jié)

    springboot整合mybatis分頁(yè)攔截器的問(wèn)題小結(jié)

    springboot整合mybatis分頁(yè)攔截器,分頁(yè)攔截實(shí)際上就是獲取sql后將sql拼接limit,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-07-07
  • 基于SpringBoot上傳任意文件功能的實(shí)現(xiàn)

    基于SpringBoot上傳任意文件功能的實(shí)現(xiàn)

    下面小編就為大家?guī)?lái)一篇基于SpringBoot上傳任意文件功能的實(shí)現(xiàn)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08

最新評(píng)論

昭苏县| 云南省| 南投县| 论坛| 青岛市| 苍溪县| 江达县| 石楼县| 武夷山市| 平武县| 黔南| 二手房| 若羌县| 水富县| 边坝县| 宁远县| 罗源县| 沙河市| 油尖旺区| 旬邑县| 双柏县| 江安县| 衡山县| 扬中市| 阿克| 嘉峪关市| 台中县| 龙陵县| 汶上县| 新田县| 肇源县| 浮山县| 昌都县| 调兵山市| 许昌市| 宣武区| 聂拉木县| 旌德县| 连山| 黎川县| 玉溪市|