1. 程式人生 > >java 泛型詳解(普通泛型、 萬用字元、 泛型介面,泛型陣列,泛型方法,泛型巢狀)

java 泛型詳解(普通泛型、 萬用字元、 泛型介面,泛型陣列,泛型方法,泛型巢狀)

JDK1.5 令我們期待很久,可是當他釋出的時候卻更換版本號為5.0。這說明Java已經有大幅度的變化。本文將講解JDK5.0支援的新功能-----Java的泛型. 

1、Java泛型 

其實Java的泛型就是建立一個用型別作為引數的類。就象我們寫類的方法一樣,方法是這樣的method(String str1,String str2 ),方法中引數str1、str2的值是可變的。而泛型也是一樣的,這樣寫class Java_Generics<K,V>,這裡邊的K和V就象方法中的引數str1和str2,也是可變。

 編寫泛型類要注意: 

1) 在定義一個泛型類的時候,在 “<>”之間定義形式型別引數,例如:“class TestGen<K,V>”,其中“K” , “V”不代表值,而是表示型別。 

2) 例項化泛型物件的時候,一定要在類名後面指定型別引數的值(型別),一共要有兩次書寫。例如:

TestGen<String,String> t=new TestGen<String,String>(); 

3) 泛型中<K extends Object>,extends並不代表繼承,它是類型範圍限制。 

普通泛型

Java程式碼 
  1. class Point<T>{       // 此處可以隨便寫識別符號號,T是type的簡稱  
  2.     private T var ; // var的型別由T指定,即:由外部指定  
  3.     public T getVar(){  // 返回值的型別由外部決定  
  4.         return var ;  
  5.     }  
  6.     public void setVar(T var){  // 設定的型別也由外部決定  
  7.         this.var = var ;  
  8.     }  
  9. };  
  10. public class GenericsDemo06{  
  11.     public static void main(String args[]){  
  12.         Point<String> p = new Point<String>() ; // 裡面的var型別為String型別  
  13.         p.setVar("it") ;        // 設定字串  
  14.         System.out.println(p.getVar().length()) ;   // 取得字串的長度  
  15.     }  
  16. };  
  17. ----------------------------------------------------------  
  18. class Notepad<K,V>{       // 此處指定了兩個泛型型別  
  19.     private K key ;     // 此變數的型別由外部決定  
  20.     private V value ;   // 此變數的型別由外部決定  
  21.     public K getKey(){  
  22.         return this.key ;  
  23.     }  
  24.     public V getValue(){  
  25.         return this.value ;  
  26.     }  
  27.     public void setKey(K key){  
  28.         this.key = key ;  
  29.     }  
  30.     public void setValue(V value){  
  31.         this.value = value ;  
  32.     }  
  33. };  
  34. public class GenericsDemo09{  
  35.     public static void main(String args[]){  
  36.         Notepad<String,Integer> t = null ;        // 定義兩個泛型型別的物件  
  37.         t = new Notepad<String,Integer>() ;       // 裡面的key為String,value為Integer  
  38.         t.setKey("湯姆") ;        // 設定第一個內容  
  39.         t.setValue(20) ;            // 設定第二個內容  
  40.         System.out.print("姓名;" + t.getKey()) ;      // 取得資訊  
  41.         System.out.print(",年齡;" + t.getValue()) ;       // 取得資訊  
  42.     }  
  43. };  

 萬用字元

Java程式碼 
  1. class Info<T>{  
  2.     private T var ;     // 定義泛型變數  
  3.     public void setVar(T var){  
  4.         this.var = var ;  
  5.     }  
  6.     public T getVar(){  
  7.         return this.var ;  
  8.     }  
  9.     public String toString(){   // 直接列印  
  10.         return this.var.toString() ;  
  11.     }  
  12. };  
  13. public class GenericsDemo14{  
  14.     public static void main(String args[]){  
  15.         Info<String> i = new Info<String>() ;       // 使用String為泛型型別  
  16.         i.setVar("it") ;                            // 設定內容  
  17.         fun(i) ;  
  18.     }  
  19.     public static void fun(Info<?> temp){     // 可以接收任意的泛型物件  
  20.         System.out.println("內容:" + temp) ;  
  21.     }  
  22. };  

 受限泛型

Java程式碼 
  1. class Info<T>{  
  2.     private T var ;     // 定義泛型變數  
  3.     public void setVar(T var){  
  4.         this.var = var ;  
  5.     }  
  6.     public T getVar(){  
  7.         return this.var ;  
  8.     }  
  9.     public String toString(){   // 直接列印  
  10.         return this.var.toString() ;  
  11.     }  
  12. };  
  13. public class GenericsDemo17{  
  14.     public static void main(String args[]){  
  15.         Info<Integer> i1 = new Info<Integer>() ;        // 宣告Integer的泛型物件  
  16.         Info<Float> i2 = new Info<Float>() ;            // 宣告Float的泛型物件  
  17.         i1.setVar(30) ;                                 // 設定整數,自動裝箱  
  18.         i2.setVar(30.1f) ;                              // 設定小數,自動裝箱  
  19.         fun(i1) ;  
  20.         fun(i2) ;  
  21.     }  
  22.     public static void fun(Info<? extends Number> temp){  // 只能接收Number及其Number的子類  
  23.         System.out.print(temp + "、") ;  
  24.     }  
  25. };  
  26. ----------------------------------------------------------  
  27. class Info<T>{  
  28.     private T var ;     // 定義泛型變數  
  29.     public void setVar(T var){  
  30.         this.var = var ;  
  31.     }  
  32.     public T getVar(){  
  33.         return this.var ;  
  34.     }  
  35.     public String toString(){   // 直接列印  
  36.         return this.var.toString() ;  
  37.     }  
  38. };  
  39. public class GenericsDemo21{  
  40.     public static void main(String args[]){  
  41.         Info<String> i1 = new Info<String>() ;      // 宣告String的泛型物件  
  42.         Info<Object> i2 = new Info<Object>() ;      // 宣告Object的泛型物件  
  43.         i1.setVar("hello") ;  
  44.         i2.setVar(new Object()) ;  
  45.         fun(i1) ;  
  46.         fun(i2) ;  
  47.     }  
  48.     public static void fun(Info<? super String> temp){    // 只能接收String或Object型別的泛型  
  49.         System.out.print(temp + "、") ;  
  50.     }  
  51. };  

 泛型無法向上轉型

Java程式碼 
  1. class Info<T>{  
  2.     private T var ;     // 定義泛型變數  
  3.     public void setVar(T var){  
  4.         this.var = var ;  
  5.     }  
  6.     public T getVar(){  
  7.         return this.var ;  
  8.     }  
  9.     public String toString(){   // 直接列印  
  10.         return this.var.toString() ;  
  11.     }  
  12. };  
  13. public class GenericsDemo23{  
  14.     public static void main(String args[]){  
  15.         Info<String> i1 = new Info<String>() ;      // 泛型型別為String  
  16.         Info<Object> i2 = null ;  
  17.         i2 = i1 ;                               //這句會出錯 incompatible types  
  18.     }  
  19. };  

 泛型介面

Java程式碼 
  1. interface Info<T>{        // 在介面上定義泛型  
  2.     public T getVar() ; // 定義抽象方法,抽象方法的返回值就是泛型型別  
  3. }  
  4. class InfoImpl<T> implements Info<T>{   // 定義泛型介面的子類  
  5.     private T var ;             // 定義屬性  
  6.     public InfoImpl(T var){     // 通過構造方法設定屬性內容  
  7.         this.setVar(var) ;    
  8.     }  
  9.     public void setVar(T var){  
  10.         this.var = var ;  
  11.     }  
  12.     public T getVar(){  
  13.         return this.var ;  
  14.     }  
  15. };  
  16. public class GenericsDemo24{  
  17.     public static void main(String arsg[]){  
  18.         Info<String> i = null;        // 宣告介面物件  
  19.         i = new InfoImpl<String>("湯姆") ;  // 通過子類例項化物件  
  20.         System.out.println("內容:" + i.getVar()) ;  
  21.     }  
  22. };  
  23. ----------------------------------------------------------  
  24. interface Info<T>{        // 在介面上定義泛型  
  25.     public T getVar() ; // 定義抽象方法,抽象方法的返回值就是泛型型別  
  26. }  
  27. class InfoImpl implements Info<String>{   // 定義泛型介面的子類  
  28.     private String var ;                // 定義屬性  
  29.     public InfoImpl(String var){        // 通過構造方法設定屬性內容  
  30.         this.setVar(var) ;    
  31.     }  
  32.     public void setVar(String var){  
  33.         this.var = var ;  
  34.     }  
  35.     public String getVar(){  
  36.         return this.var ;  
  37.     }  
  38. };  
  39. public class GenericsDemo25{  
  40.     public static void main(String arsg[]){  
  41.         Info i = null;      // 宣告介面物件  
  42.         i = new InfoImpl("湯姆") ;    // 通過子類例項化物件  
  43.         System.out.println("內容:" + i.getVar()) ;  
  44.     }  
  45. };  

 泛型方法

Java程式碼 
  1. class Demo{  
  2.     public <T> T fun(T t){            // 可以接收任意型別的資料  
  3.         return t ;                  // 直接把引數返回  
  4.     }  
  5. };  
  6. public class GenericsDemo26{  
  7.     public static void main(String args[]){  
  8.         Demo d = new Demo() ;   // 例項化Demo物件  
  9.         String str = d.fun("湯姆") ; //   傳遞字串  
  10.         int i = d.fun(30) ;     // 傳遞數字,自動裝箱  
  11.         System.out.println(str) ;   // 輸出內容  
  12.         System.out.println(i) ;     // 輸出內容  
  13.     }  
  14. };  

 通過泛型方法返回泛型型別例項

Java程式碼 
  1. class Info<T extends Number>{ // 指定上限,只能是數字型別  
  2.     private T var ;     // 此型別由外部決定  
  3.     public T getVar(){  
  4.         return this.var ;     
  5.     }  
  6.     public void setVar(T var){  
  7.         this.var = var ;  
  8.     }  
  9.     public String toString(){       // 覆寫Object類中的toString()方法  
  10.         return this.var.toString() ;      
  11.     }  
  12. };  
  13. public class GenericsDemo27{  
  14.     public static void main(String args[]){  
  15.         Info<Integer> i = fun(30) ;  
  16.         System.out.println(i.getVar()) ;  
  17.     }  
  18.     public static <T extends Number> Info<T> fun(T param){//方法中傳入或返回的泛型型別由呼叫方法時所設定的引數型別決定  
  19.         Info<T> temp = new Info<T>() ;      // 根據傳入的資料型別例項化Info  
  20.         temp.setVar(param) ;        // 將傳遞的內容設定到Info物件的var屬性之中  
  21.         return temp ;   // 返回例項化物件  
  22.     }  
  23. };  

 使用泛型統一傳入的引數型別

Java程式碼 
  1. class Info<T>{    // 指定上限,只能是數字型別  
  2.     private T var ;     // 此型別由外部決定  
  3.     public T getVar(){  
  4.         return this.var ;     
  5.     }  
  6.     public void setVar(T var){  
  7.         this.var = var ;  
  8.     }  
  9.     public String toString(){       // 覆寫Object類中的toString()方法  
  10.         return this.var.toString() ;      
  11.     }  
  12. };  
  13. public class GenericsDemo28{  
  14.     public static void main(String args[]){  
  15.         Info<String> i1 = new Info<String>() ;  
  16.         Info<String> i2 = new Info<String>() ;  
  17.         i1.setVar("HELLO") ;        // 設定內容  
  18.         i2.setVar("湯姆") ;       // 設定內容  
  19.         add(i1,i2) ;  
  20.     }  
  21.     public static <T> void add(Info<T> i1,Info<T> i2){  
  22.         System.out.println(i1.getVar() + " " + i2.getVar()) ;  
  23.     }  
  24. };  

 泛型陣列

Java程式碼
  1. public class GenericsDemo30{  
  2.     public static void main(String args[]){  
  3.         Integer i[] = fun1(1,2,3,4,5,6) ;   // 返回泛型陣列  
  4.         fun2(i) ;  
  5.     }  
  6.     public static <T> T[] fun1(T...arg){  // 接收可變引數  
  7.         return arg ;            // 返回泛型陣列  
  8.     }  
  9.     public static <T> void fun2(T param[]){   // 輸出  
  10.         System.out.print("接收泛型陣列:") ;  
  11.         for(T t:param){  
  12.             System.out.print(t + "、") ;  
  13.         }  
  14.     }  
  15. };  

 泛型的巢狀設定

Java程式碼
  1. class Info<T,V>{      // 接收兩個泛型型別  
  2.     private T var ;  
  3.     private V value ;  
  4.     public Info(T var,V value){  
  5.         this.setVar(var) ;  
  6.         this.setValue(value) ;  
  7.     }  
  8.     public void setVar(T var){  
  9.         this.var = var ;  
  10.     }  
  11.     public void setValue(V value){  
  12.         this.value = value ;  
  13.     }  
  14.     public T getVar(){  
  15.         return this.var ;  
  16.     }  
  17.     public V getValue(){  
  18.         return this.value ;  
  19.     }  
  20. };  
  21. class Demo<S>{  
  22.     private S info ;  
  23.     public Demo(S info){  
  24.         this.setInfo(info) ;  
  25.     }  
  26.     public void setInfo(S info){  
  27.         this.info = info ;  
  28.     }  
  29.     public S getInfo(){  
  30.         return this.info ;  
  31.     }  
  32. };  
  33. public class GenericsDemo31{  
  34.     public static void main(String args[]){  
  35.         Demo<Info<String,Integer>> d = null ;       // 將Info作為Demo的泛型型別  
  36.         Info<String,Integer> i = null ;   // Info指定兩個泛型型別  
  37.         i = new Info<String,Integer>("湯姆",30) ;    // 例項化Info物件  
  38.         d = new Demo<Info<String,Integer>>(i) ; // 在Demo類中設定Info類的物件  
  39.         System.out.println("內容一:" + d.getInfo().getVar()) ;  
  40.         System.out.println("內容二:" + d.getInfo().getValue()) ;  
  41.     }  
  42. };  

相關推薦

java 普通 字元 介面陣列方法

JDK1.5 令我們期待很久,可是當他釋出的時候卻更換版本號為5.0。這說明Java已經有大幅度的變化。本文將講解JDK5.0支援的新功能-----Java的泛型. 1、Java泛型  其實Java

day26基礎加強字元註解反射 註解使用

泛型 1、具有一個或多個泛型變數的型別被稱之為泛型類 class A<T>{} 2、在建立泛型類例項時,需要為其型別變數賦值 A<String> a = new A<String>(); 如果建立例項時,不給型別變數賦值,那麼會有一個警告。 3

java基礎總結 --- 擦除邊界字元

* 擦除的問題 * 為什麼要擦除: 1.5版本才出現泛型 為了相容之前地程式碼 * 它使得泛化的客戶端可以用非泛化的類庫來使用。 * 以及不破壞現有類庫的情況下,將泛型融入java語言。 * 擦除使得現有的非泛型客戶端程式碼能夠在不改變的情況繼續使用,直至客戶端準

Elasticsearch-字首字元正則模糊搜尋

1.對於字首的匹配搜尋: GET /forum/article/_search { "query": { "prefix": { "articleID": { "value": "J" } }

分享知識-快樂自己:Struts2動態方法動態結果字元方法內部跳轉action跳轉OGNL 的使用及注意事項

這裡主要以案例演示:涵蓋以下知識點 1、動態方法呼叫:使用關鍵 符號 ! 進行操作   例如:/名稱空間 ! 方法名 2、動態結果集:就是說,通過後臺返回的結果 ${} 獲取,重定向到符合預期的頁面。 3、萬能萬用字元:*_*  :第一個 * 為 類名、第二個 * 為方

shell學習筆記:for迴圈if語句字元命令代換引號

一、for迴圈for 變數in列表docommand1command2......done例1:vim test.sh#! /bin/bashfor str in name.listdoecho $strdone例2:vim tesh.sh#! /bin/bash for((

Java技術——Java

cal 5.1 try 既然 參數 top 兩種 泛型編程 編譯器 1.為什麽需要泛型轉載請註明出處:http://blog.csdn.net/seu_calvin/article/details/52230032泛型在Java中有很重要的地位,網上很多文章羅列各種理論,不

Java 之路 (十六) -- 字元型別擦除的限制

7. 萬用字元 萬用字元,即 “?”,用來表示未知型別。 萬用字元可用作各種情況:作為引數,欄位或區域性變數的型別;有時也作為返回型別;萬用字元從不用作泛型方法呼叫、泛型類例項建立或超型別的型別引數。 7.1 上限有界的萬用字元 使用上限萬用字元來放

java.util包——Connection接口

操作 相同 元素 叠代 cat roo soft true nbsp Connection接口介紹   Connection接口是java集合的root接口,沒有實現類,只有子接口和實現子接口的各種容器。主要用來表示java集合這一大的抽象概念。   Connection接

29---限定上限+下限+上限的體現+下限的體現+字元的體現+集合查閱的技巧

一、泛型上限 1、迭代並列印集合中的元素 (1)集合即可能是List,也可能是Set,用Collection提高擴充套件性 (2)當容器中存放的元素不確定,且裡面不準備使用具體型別的情況下,使用萬用字元 注: (1)萬用字元:?,未知型別。不明確型別時,可以用?來表示,意味著什麼

Java Scanner 類附例子學習

在筆試程式設計過程中,關於資料的讀取如果迷迷糊糊,那後來的程式設計即使想法很對,實現很好,也是徒勞,於是在這裡認真總結了Java  Scanner 類的使用 通過 Scanner 類來獲取使用者的輸入,下面是建立 Scanner 物件的基本語法: Scanner s =

Java反射機制由淺入深

一、什麼是Java反射機制? Java 反射機制在程式執行時,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意一個方法和屬性。這種 動態的獲取資訊 以及 動態呼叫物件的方法 的功能稱為 java 的反

Java 反射機制

Java 反射機制詳解(一) 主要介紹以下幾方面內容 理解 Class 類 理解 Java 的類載入機制 學會使用 ClassLoader 進行類載入 理解反射的機制 掌握 Constructor、Method、Field 類的用法 理解並掌握動態代理&n

Java 反射機制

Java 反射機制詳解(四) 4. 反射與泛型  定義一個泛型類: public class DAO<T> { //根據id獲取一個物件 T get(Integer id){ return null; }

JAVA設計模式----------裝飾者模式

今天LZ帶給大家的是裝飾者模式,提起這個設計模式,LZ心裡一陣激動,這是LZ學習JAVA以來接觸的第一個設計模式,也許也是各位接觸的第一個設計模式。記得當初老師在講IO的時候就提到過它:“是你還有你,一切拜託你。”沒錯,這就是裝飾者模式最簡潔的定義了。下面LZ引出標準的定義(

JAVA設計模式----------狀態模式

各位朋友,本次LZ分享的是狀態模式,在這之前,懇請LZ解釋一下,由於最近公司事情多,比較忙,所以導致更新速度稍微慢了些(哦,往後LZ會越來越忙=。=)。 狀態模式,又稱狀態物件模式(Pattern of Objects for States),狀態模式是物件的行為模式。

Java執行緒深度好文

Java執行緒:概念與原理 一、程序與執行緒         程序是指一個記憶體中執行的應用程式,每個程序都有自己獨立的一塊記憶體空間,即程序空間或(虛空間)。程序不依賴於執行緒而獨立存在,一個程序中可以啟動多個執行緒。比如在Windows系統中,一個執行的ex

Javaweb學習筆記——二十七——————字元反射資訊反射註解註解

泛型     1.泛型類:具有一個或多個型別變數的類,稱之為泛型類     class A<T>{     }     2.在建立泛型例項時,需要為其型別變數賦值     A<String> a = new A<String>();

Java入門提高篇】Day34 Java容器類十五WeakHashMap

public class WeakHashMapTest { public static void main(String[] args){ testWeakHashMap(); } private static void testWeakHashMap

Effective Java 第28條:利用有限制字元來提升API的靈活性

如第25條所述,引數化型別是 不可變的(invariant)。換句話說,對於任何兩個截然不同的型別tyle1和type2來說,List< Type1>既不是List< Type2>的子型別,也不是他的超型別。雖然List< Stri