W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
使用泛型,我們可以在不知道代碼操作對(duì)象的類型的情況下編寫代碼。它允許我們創(chuàng)建泛型類,構(gòu)造函數(shù)和方法。
泛型類是使用形式類型參數(shù)定義的。
形式類型參數(shù)是一個(gè)逗號(hào)分隔的變量名列表,位于類聲明中類名后面的尖括號(hào)<>中。
下面的代碼聲明一個(gè)類Wrapper,它接受一個(gè)形式類型參數(shù):
public class Wrapper<T> { }
該參數(shù)已命名為T.
T是一個(gè)類型變量,它可以是Java中的任何引用類型,例如String,Integer,Double等。
當(dāng)使用Wrapper類時(shí),指定形式類型參數(shù)值。
采用形式類型參數(shù)的類也稱為參數(shù)化類。
您可以聲明Wrapper類的變量,將String類型指定為其形式類型參數(shù)的值,如下所示。
這里,String是實(shí)際的類型參數(shù)。
Wrapper<String> stringWrapper;
Java允許我們使用泛型類而不指定形式類型參數(shù)。
這是為了向后兼容。您還可以聲明Wrapper<T>類的變量,如下所示:
Wrapper aRawWrapper;
當(dāng)使用泛型類而不指定實(shí)際的類型參數(shù)時(shí),它被稱為原始類型。上面的聲明使用Wrapper <T>類作為原始類型,因?yàn)樗鼪]有指定T的值。
泛型類的實(shí)際類型參數(shù)必須是引用類型。
原始類型不允許作為泛型類的實(shí)際類型參數(shù)。
類可以采用多個(gè)正式類型參數(shù)。下面的代碼聲明一個(gè)Mapper類,它接受兩個(gè)形式參數(shù)T和R:
public class Mapper<T, R> { }
我們可以聲明Mapper <T,R>類的變量如下:
Mapper<String, Integer> mapper;
這里,實(shí)際的類型參數(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ù)來聲明實(shí)例變量obj,以聲明其構(gòu)造函數(shù)和set()方法的形式參數(shù),以及作為get()方法的返回類型。
您可以通過為構(gòu)造函數(shù)指定實(shí)際的類型參數(shù)來創(chuàng)建泛型類型的對(duì)象,如下所示:
Wrapper<String> w1 = new Wrapper<String>("Hello");
我們可以省略實(shí)際的類型參數(shù)。在下面的代碼中,編譯器會(huì)將構(gòu)造函數(shù)的實(shí)際類型參數(shù)推斷為String:
Wrapper<String> w1 = new Wrapper<>("Hello");
一旦你聲明了泛型類的一個(gè)變量,你可以把形式類型參數(shù)看作是指定的實(shí)際類型參數(shù)。
現(xiàn)在,你可以認(rèn)為,對(duì)于w1,Wrapper類的get()方法返回一個(gè)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; } }
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: