Java 泛型類

2018-01-19 10:46 更新

Java面向?qū)ο笤O(shè)計 - Java泛型類


使用泛型,我們可以在不知道代碼操作對象的類型的情況下編寫代碼。它允許我們創(chuàng)建泛型類,構(gòu)造函數(shù)和方法。

泛型類是使用形式類型參數(shù)定義的。

形式類型參數(shù)是一個逗號分隔的變量名列表,位于類聲明中類名后面的尖括號<>中。

語法

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

public class Wrapper<T>  {

}

該參數(shù)已命名為T.

T是一個類型變量,它可以是Java中的任何引用類型,例如String,Integer,Double等。

當(dāng)使用Wrapper類時,指定形式類型參數(shù)值。


形式參數(shù)

采用形式類型參數(shù)的類也稱為參數(shù)化類。

您可以聲明Wrapper類的變量,將String類型指定為其形式類型參數(shù)的值,如下所示。

這里,String是實際的類型參數(shù)。

Wrapper<String> stringWrapper;

Java允許我們使用泛型類而不指定形式類型參數(shù)。

用法

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

Wrapper  aRawWrapper;

當(dāng)使用泛型類而不指定實際的類型參數(shù)時,它被稱為原始類型。上面的聲明使用Wrapper <T>類作為原始類型,因為它沒有指定T的值。

泛型類的實際類型參數(shù)必須是引用類型。

原始類型不允許作為泛型類的實際類型參數(shù)。

類可以采用多個正式類型參數(shù)。下面的代碼聲明一個Mapper類,它接受兩個形式參數(shù)T和R:

public class Mapper<T, R>    {

}

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

Mapper<String, Integer>  mapper;

這里,實際的類型參數(shù)是String和Integer。

形式類型參數(shù)在類體中可用作類型。

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>類使用形式類型參數(shù)來聲明實例變量obj,以聲明其構(gòu)造函數(shù)和set()方法的形式參數(shù),以及作為get()方法的返回類型。

您可以通過為構(gòu)造函數(shù)指定實際的類型參數(shù)來創(chuàng)建泛型類型的對象,如下所示:

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

我們可以省略實際的類型參數(shù)。在下面的代碼中,編譯器會將構(gòu)造函數(shù)的實際類型參數(shù)推斷為String:

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

一旦你聲明了泛型類的一個變量,你可以把形式類型參數(shù)看作是指定的實際類型參數(shù)。

現(xiàn)在,你可以認為,對于w1,Wrapper類的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;
  }
}
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號