1. 程式人生 > >泛型類和泛型方法

泛型類和泛型方法

規則和限制  1、泛型的型別引數只能是類型別(包括自定義類),不能是簡單型別。  2、同一種泛型可以對應多個版本(因為引數型別是不確定的),不同版本的泛型類例項是不相容的。  3、泛型的型別引數可以有多個。  4、泛型的引數型別可以使用extends語句,例如<T extends superclass>。習慣上稱為“有界型別”。  5、泛型的引數型別還可以是萬用字元型別。例如Class<?> classType = Class.forName("java.lang.String");  泛型還有介面、方法等等,內容很多,需要花費一番功夫才能理解掌握並熟練應用。在此給出我曾經瞭解泛型時候寫出的兩個例子(根據看的印象寫的),實現同樣的功能,一個使用了泛型,一個沒有使用,通過對比,可以很快學會泛型的應用,學會這個基本上學會了泛型70%的內容。  例子一:使用了泛型  

class Gen<T> {  private T ob; //定義泛型成員變數  public Gen(T ob) {  this.ob = ob;  }  public T getOb() {  return ob;  }  public void setOb(T ob) {  this.ob = ob;  }  public void showType() {  System.out.println("T的實際型別是: " + ob.getClass().getName());  }  }  public class GenDemo {  public static void main(String[] args){  //定義泛型類Gen的一個Integer版本  Gen<Integer> intOb=new Gen<Integer>(88);  intOb.showType();  int i= intOb.getOb();  System.out.println("value= " + i);  System.out.println("----------------------------------");  //定義泛型類Gen的一個String版本  Gen<String> strOb=new Gen<String>("Hello Gen!");  strOb.showType();  String s=strOb.getOb();  System.out.println("value= " + s);  }  }


執行結果:

T的實際型別是:  java.lang.Integer  value= 88

到目前為止,我們看到的泛型,都是應用於整個類上。但同樣可以在類中包含引數化方法,而這個方法所在的類可以是泛型類,也可以不是泛型類。也就是說,是否擁有泛型方法,與其所在的類是否是泛型沒有關係。

泛型方法使得該方法能夠獨立於類而產生變化。以下是一個基本的指導原則:無論何時,只要你能做到,你就應該儘量使用泛型方法。也就是說,如果使用泛型方法可以取代將整個類泛型化,那麼就應該只使用泛型方法,因為它可以使事情更清楚明白。另外,對於一個static的方法而言,無法訪問泛型類的型別引數,所以,如果static方法需要使用泛型能力,就必須使其成為泛型方法。
要定義泛型方法,只需將泛型引數列表置於返回值之前,就像下面這樣:
GenericMethods並不是引數化的,儘管這個類和其內部的方法可以被同時引數化,但是在這個例子中,只有方法f()擁有型別引數。這是由該方法的返回型別前面的型別引數列表指明的。
注意,當使用泛型類時,必須在建立物件的時候指定型別引數的值,而使用泛型方法的時候,通常不必指明引數型別,因為編譯器會為我們找出具體的型別。這稱為型別引數推斷(type argument inference)。因此,我們可以像呼叫普通方法一樣呼叫f(),而且就好像是f()被無限次地過載過。它甚至可以接受GenericMethods作為其型別引數。
如果呼叫f()時傳入基本型別,自動打包機制就會介入其中,將基本型別的值包裝為對應的物件。事實上,泛型方法與自動打包避免了許多以前我們不得不自己編寫出來的程式碼。