华南俳烁实业有限公司

java

當(dāng)前位置:中華考試網(wǎng) >> java >> java教程 >> 文章內(nèi)容

Java中自定義泛型方法的使用

來源:中華考試網(wǎng)  [2020年10月26日]  【

  在學(xué)習(xí)java的過程中,我們常常會(huì)遇到泛型方法,泛型方法使得該方法能獨(dú)立于類而產(chǎn)生變化。下面,我們可以寫一個(gè)泛型方法,使其方法在調(diào)用時(shí)可以接收不同類型的參數(shù)。根據(jù)傳遞給泛型方法的參數(shù)類型,編譯器適當(dāng)?shù)靥幚砻恳粋(gè)方法調(diào)用。

  以下是一個(gè)基本的指導(dǎo)原則:

  無論何時(shí),只要你能做到,你就應(yīng)該盡量使用泛型方法。也就是說,如果使用泛型方法可以取代將整個(gè)類泛型化,那么就應(yīng)該只使用泛型方法,因?yàn)樗梢允故虑楦宄靼。另外,?duì)于一個(gè)static的方法而言,無法訪問泛型類的類型參數(shù)。所以,如果static方法需要使用泛型能力,就必須使其成為泛型方法。

  下面是定義泛型方法的規(guī)則:

  1)所有泛型方法聲明都有一個(gè)類型參數(shù)聲明部分(由尖括號(hào)分隔),該類型參數(shù)聲明部分在方法返回類型之前(在下面例子中的)。

  2)每一個(gè)類型參數(shù)聲明部分包含一個(gè)或多個(gè)類型參數(shù),參數(shù)間用逗號(hào)隔開。一個(gè)泛型參數(shù),也被稱為一個(gè)類型變量,是用于指定一個(gè)泛型類型名稱的標(biāo)識(shí)符。

  3)類型參數(shù)能被用來聲明返回值類型,并且能作為泛型方法得到的實(shí)際參數(shù)類型的占位符。

  4)泛型方法體的聲明和其他方法一樣。注意類型參數(shù)只能代表引用型類型,不能是原始類型(像int,double,char的等)。

  下面舉一些泛型方法的示例:

  /**

  * public 與 返回值中間非常重要,可以理解為聲明此方法為泛型方法。

  * 只有聲明了等的方法才是泛型方法,泛型類中的使用了泛型的成員方法并不是泛型方法。

  * 表明該方法將使用泛型類型T,此時(shí)才可以在方法中使用泛型類型T。

  * 與泛型類的定義一樣,此處T可以隨便寫為任意標(biāo)識(shí),常見的如T、E、K、V等形式的參數(shù)常用于表示泛型。

  */

  public class GenericMethods {

  public void genericMethod1(T t){

  System.out.println(t.getClass().getName());

  }

  public T genericMethod2( Class tClass ) throws InstantiationException ,

  IllegalAccessException {

  T t = tClass.newInstance();

  return t;

  }

  public static void genericMethod3( T[] inputArray ) {

  // 輸出數(shù)組元素

  for ( E element : inputArray ){

  System.out.printf( "%s ", element );

  }

  }

  }

  說明一下,定義泛型方法時(shí),必須在返回值前邊加一個(gè),來聲明這是一個(gè)泛型方法,持有一個(gè)泛型T,然后才可以用泛型T作為方法的返回值或參數(shù)類型等。

  泛型類是在實(shí)例化類的時(shí)候指明泛型的具體類型,而泛型方法是在調(diào)用方法的時(shí)候指明泛型的具體類型 。

  泛型方法可以在任何地方和任何場(chǎng)景中使用,但是有一種情況是非常特殊的,當(dāng)泛型方法出現(xiàn)在泛型類中時(shí),我們?cè)偻ㄟ^一個(gè)例子看一下:

  /**

  * 這是一個(gè)泛型類

  */

  class GenericClassDemo {

  /**

  * 這個(gè)不是泛型方法,只是使用了泛型類中已聲明的T

  */

  public void show1(T t){

  System.out.println(t.toString());

  }

  /**

  * 泛型方法,使用泛型E,這種泛型E可以為任意類型?梢灶愋团cT相同,也可以不同。

  * 由于下面的泛型方法在聲明的時(shí)候聲明了泛型,因此即使在泛型類中并未聲明泛型,

  * 編譯器也能夠正確識(shí)別泛型方法中識(shí)別的泛型。

  */

  public void show2(E e){

  System.out.println(e.toString());

  }

  /**

  * 在泛型類中聲明了一個(gè)泛型方法,使用泛型T,注意這個(gè)T是一種全新的類型;

  * 可以與泛型類中聲明的T不是同一種類型。

  */

  public void show3(T t){

  System.out.println(t.toString());

  }

  }

  泛型方法和可變參數(shù)

  泛型方法與可變參數(shù)列表能很好地共存:

  public class GenericMethodTest {

  public void printArgs( T... args ){

  for(T t : args){

  System.out.print(t + " ");

  }

  }

  public static List toList(T... args){

  List result = new ArrayList();

  for(T item:args)

  result.add(item);

  return result;

  }

  public static void main(String[] args) {

  GenericMethodTest gmt = new GenericMethodTest();

  gmt.printArgs("A","B"); // A B

  List ls = GenericMethodTest.toList("A");

  System.out.println(ls); // [A]

  ls = GenericMethodTest.toList("A","B","C");

  System.out.println(ls); // [A,B,C]

  }

  }

  靜態(tài)方法使用泛型

  靜態(tài)方法無法訪問類上定義的泛型,如果靜態(tài)方法操作的引用數(shù)據(jù)類型不確定的時(shí)候,必須要將泛型定義在方法上。即:如果靜態(tài)方法要使用泛型的話,必須將靜態(tài)方法也定義成泛型方法 。

  public class GenericTest {

  /**

  * 如果在類中定義使用泛型的靜態(tài)方法,需要添加額外的泛型聲明

  * 即使靜態(tài)方法不可以使用泛型類中已經(jīng)聲明過的泛型(需將這個(gè)方法定義成泛型方法)

  * 如:public static void genericMethod(T t){..},此時(shí)編譯器會(huì)提示錯(cuò)誤信息:

  * "StaticGenerator cannot be refrenced from static context"

  */

  public static void genericMethod(T t) {

  // ...

  }

  }

  填寫下面表單即可預(yù)約申請(qǐng)免費(fèi)試聽java課程!害怕學(xué)不會(huì)?助教全程陪讀,隨時(shí)解惑!擔(dān)心就業(yè)?一地學(xué)習(xí),可全國推薦就業(yè)!

預(yù)約申請(qǐng)免費(fèi)聽java課程

  • 地區(qū):
  • 姓名:
  • 手機(jī):
責(zé)編:fushihao
  • 會(huì)計(jì)考試
  • 建筑工程
  • 職業(yè)資格
  • 醫(yī)藥考試
  • 外語考試
  • 學(xué)歷考試
吴川市| 三亚市| 成都市| 清原| 丰都县| 塔城市| 兰坪| 岳西县| 双辽市| 鄂托克旗| 自治县| 舞阳县| 宁化县| 察雅县| 南雄市| 府谷县| 桂阳县| 浦东新区| 蒙城县| 府谷县| 南充市| 任丘市| 年辖:市辖区| 永年县| 昌吉市| 浦东新区| 西乌珠穆沁旗| 辰溪县| 米林县| 德州市| 钦州市| 苏尼特右旗| 临漳县| 旺苍县| 军事| 青神县| 晋城| 江山市| 云龙县| 宁阳县| 长沙市|