- 首頁|
- 網(wǎng)校|
- 焚題庫|
- APP |
-
微信公眾號(hào)
在學(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可以隨便寫為任意標(biāo)識(shí),常見的如T、E、K、V等形式的參數(shù)常用于表示泛型。
*/
public class GenericMethods {
public
System.out.println(t.getClass().getName());
}
public
IllegalAccessException {
T t = tClass.newInstance();
return t;
}
public static
// 輸出數(shù)組元素
for ( E element : inputArray ){
System.out.printf( "%s ", element );
}
}
}
說明一下,定義泛型方法時(shí),必須在返回值前邊加一個(gè)
泛型類是在實(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
System.out.println(e.toString());
}
/**
* 在泛型類中聲明了一個(gè)泛型方法,使用泛型T,注意這個(gè)T是一種全新的類型;
* 可以與泛型類中聲明的T不是同一種類型。
*/
public
System.out.println(t.toString());
}
}
泛型方法和可變參數(shù)
泛型方法與可變參數(shù)列表能很好地共存:
public class GenericMethodTest {
public
for(T t : args){
System.out.print(t + " ");
}
}
public static
List
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
// ...
}
}
填寫下面表單即可預(yù)約申請(qǐng)免費(fèi)試聽java課程!害怕學(xué)不會(huì)?助教全程陪讀,隨時(shí)解惑!擔(dān)心就業(yè)?一地學(xué)習(xí),可全國推薦就業(yè)!
初級(jí)會(huì)計(jì)職稱中級(jí)會(huì)計(jì)職稱經(jīng)濟(jì)師注冊(cè)會(huì)計(jì)師證券從業(yè)銀行從業(yè)會(huì)計(jì)實(shí)操統(tǒng)計(jì)師審計(jì)師高級(jí)會(huì)計(jì)師基金從業(yè)資格稅務(wù)師資產(chǎn)評(píng)估師國際內(nèi)審師ACCA/CAT價(jià)格鑒證師統(tǒng)計(jì)資格從業(yè)
一級(jí)建造師二級(jí)建造師消防工程師造價(jià)工程師土建職稱房地產(chǎn)經(jīng)紀(jì)人公路檢測(cè)工程師建筑八大員注冊(cè)建筑師二級(jí)造價(jià)師監(jiān)理工程師咨詢工程師房地產(chǎn)估價(jià)師 城鄉(xiāng)規(guī)劃師結(jié)構(gòu)工程師巖土工程師安全工程師設(shè)備監(jiān)理師環(huán)境影響評(píng)價(jià)土地登記代理公路造價(jià)師公路監(jiān)理師化工工程師暖通工程師給排水工程師計(jì)量工程師
人力資源考試教師資格考試出版專業(yè)資格健康管理師導(dǎo)游考試社會(huì)工作者司法考試職稱計(jì)算機(jī)營(yíng)養(yǎng)師心理咨詢師育嬰師事業(yè)單位教師招聘公務(wù)員公選考試招警考試選調(diào)生村官
執(zhí)業(yè)藥師執(zhí)業(yè)醫(yī)師衛(wèi)生資格考試衛(wèi)生高級(jí)職稱護(hù)士資格證初級(jí)護(hù)師主管護(hù)師住院醫(yī)師臨床執(zhí)業(yè)醫(yī)師臨床助理醫(yī)師中醫(yī)執(zhí)業(yè)醫(yī)師中醫(yī)助理醫(yī)師中西醫(yī)醫(yī)師中西醫(yī)助理口腔執(zhí)業(yè)醫(yī)師口腔助理醫(yī)師公共衛(wèi)生醫(yī)師公衛(wèi)助理醫(yī)師實(shí)踐技能內(nèi)科主治醫(yī)師外科主治醫(yī)師中醫(yī)內(nèi)科主治兒科主治醫(yī)師婦產(chǎn)科醫(yī)師西藥士/師中藥士/師臨床檢驗(yàn)技師臨床醫(yī)學(xué)理論中醫(yī)理論