欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

初步理解Java的泛型特性

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

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

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

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

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

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

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

 應(yīng)改為

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

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

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

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

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

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

 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);//此時T為Number, S為Integer
 testGenericMethodDefine(o, i);//T為Object, S為Integer
 
 List<Number> list1 = null;
 testGenericMethodDefine3(i, list1)//此時T為Number
 
 List<Integer> list2 = null;
 testGenericMethodDefine4(list1, list2)//編譯報錯

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

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

 注意: 在Java集合框架中,對于參數(shù)值是未知類型的容器類,只能讀取其中元素,不能像其中添加元素,
 因為,其類型是未知,所以編譯器無法識別添加元素的類型和容器的類型是否兼容,唯一的例外是NULL

 List<String> listString;
 List<?> unknownList2 = listString;
 unknownList = unknownList2;
 listString = unknownList;//編譯錯誤

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

 List<Integer>[] iListArray;
 new ArrayList<Integer>[10];//編譯時錯誤

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

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

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

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

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

相關(guān)文章

  • 基于常用json框架介紹和Jackson返回結(jié)果處理方式

    基于常用json框架介紹和Jackson返回結(jié)果處理方式

    這篇文章主要介紹了基于常用json框架介紹和Jackson返回結(jié)果處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java編碼輔助工具M(jìn)apstruct用法詳解

    Java編碼輔助工具M(jìn)apstruct用法詳解

    這篇文章主要介紹了Java編碼輔助工具M(jìn)apstruct用法詳解,手動編碼setter/getter各個對應(yīng)屬性,會顯得臃腫繁瑣。通過Mapstruct框架可簡單方便地完成這一工作。,需要的朋友可以參考下
    2019-06-06
  • Java?Collections.sort()實現(xiàn)List排序的默認(rèn)方法和自定義方法

    Java?Collections.sort()實現(xiàn)List排序的默認(rèn)方法和自定義方法

    這篇文章主要介紹了Java?Collections.sort()實現(xiàn)List排序的默認(rèn)方法和自定義方法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2017-06-06
  • java運(yùn)行時數(shù)據(jù)區(qū)域和類結(jié)構(gòu)詳解

    java運(yùn)行時數(shù)據(jù)區(qū)域和類結(jié)構(gòu)詳解

    這篇文章主要介紹了java運(yùn)行時數(shù)據(jù)區(qū)域和類結(jié)構(gòu),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • JAVA如何獲取客戶端IP地址和MAC地址

    JAVA如何獲取客戶端IP地址和MAC地址

    本篇文章主要介紹了JAVA如何獲取客戶端IP地址和MAC地址非常具有實用價值,這里整理了詳細(xì)的代碼,需要的朋友可以參考下
    2017-08-08
  • mybatis 中 foreach collection的用法小結(jié)(三種)

    mybatis 中 foreach collection的用法小結(jié)(三種)

    這篇文章主要介紹了mybatis 中 foreach collection的用法小結(jié)(三種),需要的朋友可以參考下
    2017-10-10
  • java中的final關(guān)鍵字詳解及實例

    java中的final關(guān)鍵字詳解及實例

    這篇文章主要介紹了 java中的final關(guān)鍵字詳解及實例的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • SpringBoot+SpringSecurity 不攔截靜態(tài)資源的實現(xiàn)

    SpringBoot+SpringSecurity 不攔截靜態(tài)資源的實現(xiàn)

    這篇文章主要介紹了SpringBoot+SpringSecurity 不攔截靜態(tài)資源的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • java RocketMQ快速入門基礎(chǔ)知識

    java RocketMQ快速入門基礎(chǔ)知識

    這篇文章主要介紹了java RocketMQ快速入門基礎(chǔ)知識,所以RocketMQ是站在巨人的肩膀上(kafka),又對其進(jìn)行了優(yōu)化讓其更滿足互聯(lián)網(wǎng)公司的特點(diǎn)。它是純Java開發(fā),具有高吞吐量、高可用性、適合大規(guī)模分布式系統(tǒng)應(yīng)用的特點(diǎn)。,需要的朋友可以參考下
    2019-06-06
  • 解決JDBC連接Mysql長時間無動作連接失效的問題

    解決JDBC連接Mysql長時間無動作連接失效的問題

    這篇文章主要介紹了解決JDBC連接Mysql長時間無動作連接失效的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03

最新評論