国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

黑馬程序員——泛型

2019-11-14 15:10:35
字體:
供稿:網(wǎng)友

------<a target="blank">java培訓(xùn)、Android培訓(xùn)、iOS培訓(xùn)、.Net培訓(xùn)</a>、期待與您交流! -------

(一).  泛型

1.1 介紹

  泛型是JDK5.0新增加的一個特性,泛型的本質(zhì)是參數(shù)化類型,即所操作的數(shù)據(jù)類型都被指定為一個參數(shù)。這種類型參數(shù)可以用在類、接口、和方法的創(chuàng)建中,分別稱為泛型類、泛型接口、泛型方法。Java語言引入泛型的好處是安全簡單。

1.2 認(rèn)識泛型

  在JDK5.0之前,沒有泛型的情況下,通過對類型Object的引用來實(shí)現(xiàn)參數(shù)的"任意化",但"任意化"帶來的缺點(diǎn)是需要顯示的強(qiáng)制類型轉(zhuǎn)換,此種轉(zhuǎn)換要求開發(fā)者對實(shí)際參數(shù)類型預(yù)知的情況下進(jìn)行的。對于強(qiáng)制類型轉(zhuǎn)換錯誤的情況,編譯器可能不會提示錯誤,但在運(yùn)行的時候會出現(xiàn)異常,這是一個安全隱患。

1.3 泛型的優(yōu)勢

  使用泛型的優(yōu)勢在于編譯期間檢查類型,捕捉類型不匹配錯誤,并且所有的轉(zhuǎn)換都是自動和隱式多的,提高代碼復(fù)用率。

(二).  泛型的使用 

2.1  泛型定義

  實(shí)例化泛型類的語法結(jié)構(gòu)如下:

  1 classname<type-param-list> obj = new classname<type-param-list> (cons-arg-list);  

  泛型定義通常使用一個唯一的大寫字母表示一個類型參數(shù)。

2.2  代碼演示

 1 //創(chuàng)建泛型類 2 public class Generic <T> { 3     PRivate T ob;//定義泛型成員變量 4     public Generic(T ob){ 5         this.ob = ob; 6     } 7     public T getOb(){ 8         return ob; 9     }10     public void setOb(T ob){11         this.ob = ob;12     }13     public void showType(){14         System.out.println("實(shí)際類型是:" + ob.getClass().getName());15     }16 }

  接下來創(chuàng)建類:

 1 //創(chuàng)建測試類,用于解釋泛型的使用方法 2 public class GenericDemo { 3     public static void main(String[] args) { 4         //定義泛型類Genneric的一個Integer版本 5         Generic<Integer> intOb = new Generic<Integer>(88); 6         intOb.showType(); 7         int i = intOb.getOb(); 8         System.out.println("value=" + i); 9         System.out.println("---------------------------------");10         //定義泛型類Genneric的一個String版本11         Generic<String> strOb = new Generic<String>("Hello");12         strOb.showType();13         String s = strOb.getOb();14         System.out.println("value=" + s);15     }16 }

  運(yùn)行結(jié)果:

1 實(shí)際類型是:java.lang.Integer2 value=883 ---------------------------------4 實(shí)際類型是:java.lang.String5 value=Hello

2.3  理解泛型需注意3點(diǎn)

  • 泛型的類型參數(shù)是類類型(包括自定義類),不能是基本數(shù)據(jù)類。
  • 同一種泛型可以對應(yīng)多個版本(因?yàn)轭愋蛥?shù)是不確定的),不同版本的泛型類實(shí)例是不兼容的。
  • 泛型的類型參數(shù)可以有多個。

(三).  有界類型

3.1  介紹

  在有些時候需要對類型參數(shù)的取值進(jìn)行一定程度的限制,以使數(shù)據(jù)具有可操作性。為了處理這種情況,Java提供了有界類型。在指定類型參數(shù)時可以使用extends關(guān)鍵字限制此類型參數(shù)代表的類必須繼承自指定父類或父類本身。比如創(chuàng)建一個類:public class BoundGeneric<T extends Number>{},BoundGeneric類的定義中,使用extends關(guān)鍵字將T的類型限制為Number類及其子類。

3.2  注意

  在使用extends(如:T extends someClass)聲明的泛型類進(jìn)行實(shí)例化時,運(yùn)行傳遞的類型參數(shù)是:如果someClass是類,可以傳遞someClass本身及其子類,如果someClass是接口,則可以傳遞實(shí)現(xiàn)接口的類。

3.3  通配符

  通配符由”?“來表示,代表一個未知類型。

  例如:public static void func(Generic <?> T){}或者結(jié)合有界類型使用

     public static void func(Generic <? extends Number> T)

(四).  泛型的局限

4.1 泛型的局限性

  其實(shí)Java并沒有真正的實(shí)現(xiàn)泛型,是編譯器在編譯的時候在字節(jié)碼上了做手腳(成為擦除),這種實(shí)現(xiàn)理念造成java泛型本身有很多漏洞,局限性很大。其中大多數(shù)限制性是由類型擦除引起的。

  • 泛型不能被實(shí)例化。但可以通過調(diào)用Class.newInstance和Array.newInstance方法,利用反射構(gòu)造泛型對象和數(shù)組。
  • 不能實(shí)例化泛型數(shù)組,即不能創(chuàng)建一個類型特定的泛型引用數(shù)組。如:Gen<String> []arrays = new Gen<String> [100];該語句是非法語句,因?yàn)闀p害類型安全,但是如果使用通配符,就可以創(chuàng)建泛型類型的引用數(shù)組,如:Gen<?> []arrays = new Gen<?> [10];
  • 不能用類型參數(shù)替換基本類型。因?yàn)椴脸愋秃笤鹊念愋蛥?shù)被Object或者限定類型替換,而基本類型是不能被對象所存儲的,但是可以使用基本類型的包裝類來解決此問題。
  • 異常。不能拋出也不能捕獲泛型類的異常對象,使用泛型類來擴(kuò)展Throwable也是非法的。
1 public class GenericException <T> extends Exception{2     //泛型類無法繼承Throwable,非法  3 }

  不能在catch子句中使用類型參數(shù),如下面的方法將不能編譯:

1 public static <T extends Throwable> void doWork(Class<T>  t){2     try {3     } catch (T e) {//不能捕獲類型參數(shù)異常4     }5 }

  但是,在異常聲明中可以使用類型參數(shù)。下面這個是合法的:

1 public static <T extends Throwable> void doWork(T t) throws T {2     try {3     } catch (Throwable realCause) {//不能捕獲類型參數(shù)異常4         throw t;        5     }6 }
  • 靜態(tài)成員。不能在靜態(tài)變量或者靜態(tài)方法中引用類型參數(shù)。如下述語句是非法的:
1 public class Gen<T>{2     //靜態(tài)變量不能引用類型參數(shù)3     static T ob;4     //靜態(tài)方法不能引用類型參數(shù)5     static T getOb(){6         return ob;7     }8 }

  盡管不能在靜態(tài)變量或靜態(tài)方法中引用類型參數(shù),但可以聲明靜態(tài)泛型方法。

(五).  技巧

  當(dāng)方法靜態(tài)時,不能訪問類上定義的泛型,如果靜態(tài)方法使用泛型,只能將泛型定義在方法上,注意放置位置:public static <Y> void method(Y obj)

  ? extends E :接收E類型或者E的子類對象((對于本身來說是)上限)

  ? super E  :接收E類型或者E的父類型(下限)

  在集合存元素時,一般使用上限,因?yàn)檫@樣取出都是按照上限類型來運(yùn)算,不會出現(xiàn)安全隱患。

  什么時候使用下限呢?

  通常對集合中的元素進(jìn)行取出操作時,可以用下限。

 


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 壤塘县| 墨脱县| 汾阳市| 安图县| 陆丰市| 深圳市| 金溪县| 沧州市| 师宗县| 栾城县| 颍上县| 平凉市| 梨树县| 祁东县| 根河市| 呼和浩特市| 大城县| 临夏市| 吴川市| 博爱县| 明星| 庐江县| 南川市| 阿克| 苏尼特右旗| 揭东县| 临潭县| 宕昌县| 德江县| 海城市| 原平市| 云林县| 禄劝| 比如县| 炎陵县| 双鸭山市| 鹤峰县| 苍溪县| 于田县| 资源县| 会同县|