Java基礎之Java中的泛型

來源:互聯網
上載者:User

標籤:string類   成員   cat   基礎   cal   eof   一個   size   變數   

1、為什麼要使用泛型

這裡我們倆看一段代碼;

List list = new ArrayList();  list.add("CSDN_SEU_Cavin");  list.add(100);  for (int i = 0; i < list.size(); i++) {    String name = (String) list.get(i); //取出Integer時,運行時出現異常  System.out.println("name:" + name);  } 

 本例向list類型集合中加入了一個字串類型的值和一個Integer類型的值。(這樣合法,因為此時list預設的類型為Object類型)。在之後的迴圈中,由於忘記了之前在list中也加入了Integer類型的值或其他原因,運行時會出現java.lang.ClassCastException異常。為瞭解決這個問題,泛型應運而生。

 

2、泛型的使用

泛型讓編程人員能夠使用類型抽象,通常用於集合裡面。

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

  這裡這樣寫,上面那段迴圈取值得方式就不會報錯,而且也不需要進行類型的強制轉換。通過List<String>,直接限定了list集合中只能含有String類型的元素。

 

3、泛型只在編譯期間有效

  我們在使用泛型的時候也要瞭解到泛型的編譯時間怎樣的,因此在這裡,我們需要特別的注意是:泛型,只是在代碼編譯成class檔案期間有效

AyyayList<String> a = new ArrayList<String>();  ArrayList b = new ArrayList();  Class c1 = a.getClass();  Class c2 = b.getClass();  System.out.println(a == b); 

  上面程式的輸出結果為true。是因為所有反射的操作都是在運行時進行的,既然為true,就證明了編譯之後,程式會採取去泛型化的措施。

  也就是說Java中的泛型,只在編譯階段有效。在編譯過程中,正確檢驗泛型結果後,會將泛型的相關資訊擦出,並且在對象進入和離開方法的邊界處添加類型檢查和類型轉換的方法。也就是說,成功編譯過後的class檔案中是不包含任何泛型資訊的。泛型資訊不會進入到運行時階段。

下面這段代碼通過Java的反射機制很好的解釋了泛型只在編譯期間有效

ArrayList<String> a = new ArrayList<String>();  a.add("CSDN_SEU_Cavin");  Class c = a.getClass();  try{      Method method = c.getMethod("add",Object.class);      method.invoke(a,100);      System.out.println(a);  //[CSDN_SEU_Cavin, 100]  
}catch(Exception e){
e.printStackTrace();

}

  4、泛型類和泛型方法

public static class FX<T> {      private T ob; // 定義泛型成員變數        public FX(T ob) {          this.ob = ob;      }        public T getOb() {          return ob;      }        public void showTyep() {          System.out.println("T的實際類型是: " + ob.getClass().getName());      }  }      public static void main(String[] args) {          FX<Integer> intOb = new FX<Integer>(100);          intOb.showTyep();          System.out.println("value= " + intOb.getOb());  //java.lang.Integer          System.out.println("----------------------------------");            FX<String> strOb = new FX<String>("CSDN_SEU_Calvin");          strOb.showTyep();          System.out.println("value= " + strOb.getOb());  //value= 100 } 

  

  5.泛型的好處

    (1)型別安全。 

      通過知道使用泛型定義的變數的類型限制,編譯器可以更有效地提高Java程式的型別安全。 

    (2)消除強制類型轉換。 

      消除原始碼中的許多強制類型轉換。這使得代碼更加可讀,並且減少了出錯機會。所有的強制轉換都是自動和隱式的。

    (3)提高效能

 

  6.泛型使用的注意事項

    (1)泛型的型別參數只能是類類型(包括自訂類),不能是簡單類型。

    (2)泛型的型別參數可以有多個。

    (3)不能對確切的泛型型別使用instanceof操作。如下面的操作是非法的,編譯時間會出錯。

    (4)不能建立一個確切的泛型型別的數組。

Java基礎之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.