Java泛型類

使用泛型(也叫通用),可以在不知道代碼操作的對象的類型的情況下編寫代碼。 它允許創建通用類,構造函數和方法。泛型類是使用形式類型參數定義的。
形式類型參數是一個逗號分隔的變量名列表,放在類聲明中類名後的尖括號<>中。

語法

下面的代碼聲明一個類Wrapper,它接受一個形式類型參數:

public class Wrapper<T>  {

}

上代碼中,參數已命名爲TT是一個類型變量,它可以是Java中的任何引用類型,例如:StringIntegerDouble等。

當使用Wrapper類時,要指定形式類型參數值。

實際參數

採用形式類型參數的類也稱爲參數化類。可以聲明Wrapper類的變量,將String類型指定爲其形式類型參數的值,如下所示。

Wrapper<String> stringWrapper;

這裏,String是實際的類型參數。
Java允許使用一個泛型類不指定形式類型參數。

用法

這是爲了向後兼容。還可以聲明Wrapper <T>類的變量,如下所示:

Wrapper  aRawWrapper;

當使用通用類而不指定實際的類型參數時,它被稱爲原始類型。 上面的聲明使用Wrapper <T>類作爲原始類型,因爲它沒有指定T類型的值。

通用類的實際類型參數必須是引用類型。原始類型不允許作爲通用類的實際類型參數。
類可以採用多個正式類型參數。 下面的代碼聲明一個Mapper類,它接受兩個形式參數TR

public class Mapper<T, R>    {

}

可以聲明Mapper <T,R>類的變量如下:

Mapper<String, Integer>  mapper;

這裏,實際的類型參數是StringInteger。形式類型參數在類體中可用作類型。

public class Wrapper<T> {
  private T obj;

  public Wrapper(T obj) {
    this.obj = obj;
  }

  public T get() {
    return obj;
  }

  public void set(T obj) {
    this.obj = obj;
  }
}

Wrapper <T>類使用形式類型參數來聲明實例變量obj,以聲明其構造函數和set()方法的形式參數,以及作爲get()方法的返回類型。

可以通過爲構造函數指定實際的類型參數來創建泛型類型的對象,如下所示:

Wrapper<String> w1  = new Wrapper<String>("Hello");

也可以省略實際的類型參數。 在下面的代碼中,省略指定String類型,編譯器會將構造函數的實際類型參數推斷爲String

Wrapper<String> w1  = new Wrapper<>("Hello");

當聲明瞭泛型類的一個變量,可以把形式類型參數看作是指定的實際類型參數。現在,可以認爲,對於w1Wrapper類的get()方法返回一個String

String s1=  w1.get();

示例

以下代碼顯示如何使用Wrapper類。

public class Main {
  public static void main(String[] args) {
    Wrapper<String> w1 = new Wrapper<>("Hello");
    String s1 = w1.get();
    System.out.println("s1=" + s1);

    w1.set("Testing generics");
    String s2 = w1.get();
    System.out.println("s2=" + s2);

    w1.set(null);
    String s3 = w1.get();
    System.out.println("s3=" + s3);
  }
}

class Wrapper<T> {
  private T obj;

  public Wrapper(T obj) {
    this.obj = obj;
  }

  public T get() {
    return obj;
  }

  public void set(T obj) {
    this.obj = obj;
  }
}

執行上面代碼,輸出結果如下 -

s1=Hello
s2=Testing generics
s3=null