java 泛型詳解

來源:互聯網
上載者:User

標籤:java

參考:Java泛型詳解 點擊開啟連結

泛型是在首次編譯時間刻檢查的,為了比避免僅僅是資料類型不一致而導致的重載.

在沒有泛型之前,一旦把一個對象丟進java集合中,集合就會忘記對象的類型,把所有對象當成Object類型來處理。
當程式從集合中取出對象時,就需要進行強制類型轉換,這種強制類型轉換不僅代碼臃腫,而且容易引起ClassCastException異常。
1. 將運行時出現的ClassCastException問題,再編譯時間期給解決了。運行就安全了
2. 避免了強制轉換的麻煩

//普通泛型class Point<T>{       // 此處可以隨便寫標識符號,T是type的簡稱      private T var ; // var的類型由T指定,即:由外部指定      public T getVar(){  // 傳回值的類型由外部決定          return var ;      }      public void setVar(T var){  // 設定的類型也由外部決定          this.var = var ;      }  };  public class GenericsDemo06{      public static void main(String args[]){          Point<String> p = new Point<String>() ; // 裡面的var類型為String類型          p.setVar("it") ;        // 設定字串          System.out.println(p.getVar().length()) ;   // 取得字串的長度      }  };  //----------------------------------------------------------  class Notepad<K,V>{       // 此處指定了兩個泛型型別      private K key ;     // 此變數的類型由外部決定      private V value ;   // 此變數的類型由外部決定      public K getKey(){          return this.key ;      }      public V getValue(){          return this.value ;      }      public void setKey(K key){          this.key = key ;      }      public void setValue(V value){          this.value = value ;      }  };  public class GenericsDemo09{      public static void main(String args[]){          Notepad<String,Integer> t = null ;        // 定義兩個泛型型別的對象          t = new Notepad<String,Integer>() ;       // 裡面的key為String,value為Integer          t.setKey("湯姆") ;        // 設定第一個內容          t.setValue(20) ;            // 設定第二個內容          System.out.print("姓名;" + t.getKey()) ;      // 取得資訊          System.out.print(",年齡;" + t.getValue()) ;       // 取得資訊        }  };  // 萬用字元class Info<T>{      private T var ;     // 定義泛型變數      public void setVar(T var){          this.var = var ;      }      public T getVar(){          return this.var ;      }      public String toString(){   // 直接列印          return this.var.toString() ;      }  };  public class GenericsDemo14{      public static void main(String args[]){          Info<String> i = new Info<String>() ;       // 使用String為泛型型別          i.setVar("it") ;                            // 設定內容          fun(i) ;      }      public static void fun(Info<?> temp){     // 可以接收任意的泛型對象          System.out.println("內容:" + temp) ;      }  };  // 受限泛型class Info<T>{      private T var ;     // 定義泛型變數      public void setVar(T var){          this.var = var ;      }      public T getVar(){          return this.var ;      }      public String toString(){   // 直接列印          return this.var.toString() ;      }  };  public class GenericsDemo17{      public static void main(String args[]){          Info<Integer> i1 = new Info<Integer>() ;        // 聲明Integer的泛型對象          Info<Float> i2 = new Info<Float>() ;            // 聲明Float的泛型對象          i1.setVar(30) ;                                 // 設定整數,自動裝箱          i2.setVar(30.1f) ;                              // 設定小數,自動裝箱          fun(i1) ;          fun(i2) ;      }      public static void fun(Info<? extends Number> temp){  // 只能接收Number及其Number的子類          System.out.print(temp + "、") ;      }  };  //----------------------------------------------------------  class Info<T>{      private T var ;     // 定義泛型變數      public void setVar(T var){          this.var = var ;      }      public T getVar(){          return this.var ;      }      public String toString(){   // 直接列印          return this.var.toString() ;      }  };  public class GenericsDemo21{      public static void main(String args[]){          Info<String> i1 = new Info<String>() ;      // 聲明String的泛型對象          Info<Object> i2 = new Info<Object>() ;      // 聲明Object的泛型對象          i1.setVar("hello") ;          i2.setVar(new Object()) ;          fun(i1) ;          fun(i2) ;      }      public static void fun(Info<? super String> temp){    // 只能接收String或Object類型的泛型          System.out.print(temp + "、") ;      }  };  // 泛型無法向上轉型class Info<T>{      private T var ;     // 定義泛型變數      public void setVar(T var){          this.var = var ;      }      public T getVar(){          return this.var ;      }      public String toString(){   // 直接列印          return this.var.toString() ;      }  };  public class GenericsDemo23{      public static void main(String args[]){          Info<String> i1 = new Info<String>() ;      // 泛型型別為String          Info<Object> i2 = null ;          i2 = i1 ;                               //這句會出錯 incompatible types      }  };  // 泛型介面interface Info<T>{        // 在介面上定義泛型      public T getVar() ; // 定義抽象方法,抽象方法的傳回值就是泛型型別  }  class InfoImpl<T> implements Info<T>{   // 定義泛型介面的子類      private T var ;             // 定義屬性      public InfoImpl(T var){     // 通過構造方法設定屬性內容          this.setVar(var) ;        }      public void setVar(T var){          this.var = var ;      }      public T getVar(){          return this.var ;      }  };  public class GenericsDemo24{      public static void main(String arsg[]){          Info<String> i = null;        // 聲明介面對象          i = new InfoImpl<String>("湯姆") ;  // 通過子類執行個體化對象          System.out.println("內容:" + i.getVar()) ;      }  };  //----------------------------------------------------------  interface Info<T>{        // 在介面上定義泛型      public T getVar() ; // 定義抽象方法,抽象方法的傳回值就是泛型型別  }  class InfoImpl implements Info<String>{   // 定義泛型介面的子類      private String var ;                // 定義屬性      public InfoImpl(String var){        // 通過構造方法設定屬性內容          this.setVar(var) ;        }      public void setVar(String var){          this.var = var ;      }      public String getVar(){          return this.var ;      }  };  public class GenericsDemo25{      public static void main(String arsg[]){          Info i = null;      // 聲明介面對象          i = new InfoImpl("湯姆") ;    // 通過子類執行個體化對象          System.out.println("內容:" + i.getVar()) ;      }  };  // 泛型方法class Demo{      public <T> T fun(T t){            // 可以接收任意類型的資料          return t ;                  // 直接把參數返回      }  };  public class GenericsDemo26{      public static void main(String args[]){          Demo d = new Demo() ;   // 執行個體化Demo對象          String str = d.fun("湯姆") ; //   傳遞字串          int i = d.fun(30) ;     // 傳遞數字,自動裝箱          System.out.println(str) ;   // 輸出內容          System.out.println(i) ;     // 輸出內容      }  };  // 通過泛型方法返回泛型型別執行個體class Info<T extends Number>{ // 指定上限,只能是數字類型      private T var ;     // 此類型由外部決定      public T getVar(){          return this.var ;         }      public void setVar(T var){          this.var = var ;      }      public String toString(){       // 覆寫Object類中的toString()方法          return this.var.toString() ;          }  };  public class GenericsDemo27{      public static void main(String args[]){          Info<Integer> i = fun(30) ;          System.out.println(i.getVar()) ;      }      public static <T extends Number> Info<T> fun(T param){//方法中傳入或返回的泛型型別由調用方法時所設定的參數類型決定          Info<T> temp = new Info<T>() ;      // 根據傳入的資料類型執行個體化Info          temp.setVar(param) ;        // 將傳遞的內容設定到Info對象的var屬性之中          return temp ;   // 返回執行個體化對象      }  };  // 使用泛型統一傳入的參數類型class Info<T>{    // 指定上限,只能是數字類型      private T var ;     // 此類型由外部決定      public T getVar(){          return this.var ;         }      public void setVar(T var){          this.var = var ;      }      public String toString(){       // 覆寫Object類中的toString()方法          return this.var.toString() ;          }  };  public class GenericsDemo28{      public static void main(String args[]){          Info<String> i1 = new Info<String>() ;          Info<String> i2 = new Info<String>() ;          i1.setVar("HELLO") ;        // 設定內容          i2.setVar("湯姆") ;       // 設定內容          add(i1,i2) ;      }      public static <T> void add(Info<T> i1,Info<T> i2){          System.out.println(i1.getVar() + " " + i2.getVar()) ;      }  };  // 泛型數組public class GenericsDemo30{      public static void main(String args[]){          Integer i[] = fun1(1,2,3,4,5,6) ;   // 返回泛型數組          fun2(i) ;      }      public static <T> T[] fun1(T...arg){  // 接收可變參數          return arg ;            // 返回泛型數組      }      public static <T> void fun2(T param[]){   // 輸出          System.out.print("接收泛型數組:") ;          for(T t:param){              System.out.print(t + "、") ;          }      }  };  // 泛型的嵌套設定class Info<T,V>{      // 接收兩個泛型型別      private T var ;      private V value ;      public Info(T var,V value){          this.setVar(var) ;          this.setValue(value) ;      }      public void setVar(T var){          this.var = var ;      }      public void setValue(V value){          this.value = value ;      }      public T getVar(){          return this.var ;      }      public V getValue(){          return this.value ;      }  };  class Demo<S>{      private S info ;      public Demo(S info){          this.setInfo(info) ;      }      public void setInfo(S info){          this.info = info ;      }      public S getInfo(){          return this.info ;      }  };  public class GenericsDemo31{      public static void main(String args[]){          Demo<Info<String,Integer>> d = null ;       // 將Info作為Demo的泛型型別          Info<String,Integer> i = null ;   // Info指定兩個泛型型別          i = new Info<String,Integer>("湯姆",30) ;    // 執行個體化Info對象          d = new Demo<Info<String,Integer>>(i) ; // 在Demo類中設定Info類的對象          System.out.println("內容一:" + d.getInfo().getVar()) ;          System.out.println("內容二:" + d.getInfo().getValue()) ;      }  }; 


java 泛型詳解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.