Java中泛型的示例詳解_第1頁
Java中泛型的示例詳解_第2頁
Java中泛型的示例詳解_第3頁
Java中泛型的示例詳解_第4頁
Java中泛型的示例詳解_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第Java中泛型的示例詳解目錄泛型概述使用泛型的好處泛型的定義與使用定義和使用含有泛型的類含有泛型的方法含有泛型的接口泛型通配符通配符基本使用通配符高級使用----受限泛型

泛型概述

我們都知道集合中是可以存放任意對象的,只要把對象存儲集合后,那么這時他們都會被提升成Object類型。當(dāng)我們在取出每一個對象,并且進行相應(yīng)的操作,這時必須采用類型轉(zhuǎn)換。大家觀察下面代碼:

publicclassGenericDemo{

publicstaticvoidmain(String[]args){

Collectioncoll=newArrayList();

coll.add("hello");

coll.add("zjq");

coll.add(5);//由于集合沒有做任何限定,任何類型都可以給其中存放

Iteratorit=coll.iterator();

while(it.hasNext()){

//需要打印每個字符串的長度,就要把迭代出來的對象轉(zhuǎn)成String類型

Stringstr=(String)it.next();

System.out.println(str.length());

}

程序在運行時發(fā)生了問題java.lang.ClassCastException:java.lang.Integercannotbecasttojava.lang.String。

為什么會發(fā)生類型轉(zhuǎn)換異常呢?

我們來分析下:由于集合中什么類型的元素都可以存儲。導(dǎo)致取出時強轉(zhuǎn)引發(fā)運行時ClassCastException。

怎么來解決這個問題呢?

Collection雖然可以存儲各種對象,但實際上通常Collection只存儲同一類型對象。例如都是存儲字符串對象。因此在JDK5之后,新增了泛型(Generic)語法,讓你在設(shè)計API時可以指定類或方法支持泛型,這樣我們使用API的時候也變得更為簡潔,并得到了編譯時期的語法檢查。

泛型:可以在類或方法中預(yù)支地使用未知的類型。

tips:一般在創(chuàng)建對象時,將未知的類型確定具體的類型。當(dāng)沒有指定泛型時,默認類型為Object類型。

使用泛型的好處

那么泛型帶來了哪些好處呢?

將運行時期的ClassCastException,轉(zhuǎn)移到了編譯時期變成了編譯失敗。避免了類型強轉(zhuǎn)的麻煩。

通過我們?nèi)缦麓a體驗一下:

publicclassGenericDemo2{

publicstaticvoidmain(String[]args){

CollectionStringlist=newArrayListString

coll.add("hello");

coll.add("zjq");

//list.add(5);//當(dāng)集合明確類型后,存放類型不一致就會編譯報錯

//集合已經(jīng)明確具體存放的元素類型,那么在使用迭代器的時候,迭代器也同樣會知道具體遍歷元素類型

IteratorStringit=list.iterator();

while(it.hasNext()){

Stringstr=it.next();

//當(dāng)使用IteratorString控制元素類型后,就不需要強轉(zhuǎn)了。獲取到的元素直接就是String類型

System.out.println(str.length());

tips:泛型是數(shù)據(jù)類型的一部分,我們將類名與泛型合并一起看做數(shù)據(jù)類型。

泛型的定義與使用

我們在集合中會大量使用到泛型,用來靈活地將數(shù)據(jù)類型應(yīng)用到不同的類、方法、接口當(dāng)中。將數(shù)據(jù)類型作為參數(shù)進行傳遞。

定義和使用含有泛型的類

定義格式:

修飾符class類名代表泛型的變量{}

例如,API中的ArrayList集合:

classArrayListE{

publicbooleanadd(Ee){}

publicEget(intindex){}

....

}

使用泛型:即什么時候確定泛型。

在創(chuàng)建對象的時候確定泛型

例如,ArrayListStringlist=newArrayListString

此時,變量E的值就是String類型,那么我們的類型就可以理解為:

classArrayListString{

publicbooleanadd(Stringe){}

publicStringget(intindex){}

}

再例如,ArrayListIntegerlist=newArrayListInteger

此時,變量E的值就是Integer類型,那么我們的類型就可以理解為:

classArrayListInteger{

publicbooleanadd(Integere){}

publicIntegerget(intindex){}

}

舉例自定義泛型類

publicclassMyGenericClassMVP{

//沒有MVP類型,在這里代表未知的一種數(shù)據(jù)類型未來傳遞什么就是什么類型

privateMVPmvp;

publicvoidsetMVP(MVPmvp){

this.mvp=mvp;

publicMVPgetMVP(){

returnmvp;

}

使用:

publicclassGenericClassDemo{

publicstaticvoidmain(String[]args){

//創(chuàng)建一個泛型為String的類

MyGenericClassStringmy=newMyGenericClassString

//調(diào)用setMVP

my.setMVP("大胡子登登");

//調(diào)用getMVP

Stringmvp=my.getMVP();

System.out.println(mvp);

//創(chuàng)建一個泛型為Integer的類

MyGenericClassIntegermy2=newMyGenericClassInteger

my2.setMVP(123);

Integermvp2=my2.getMVP();

}

含有泛型的方法

定義格式:

修飾符代表泛型的變量返回值類型方法名(參數(shù)){}

例如,

publicclassMyGenericMethod{

publicMVPvoidshow(MVPmvp){

System.out.println(mvp.getClass());

publicMVPMVPshow2(MVPmvp){

returnmvp;

}

使用格式:調(diào)用方法時,確定泛型的類型

publicclassGenericMethodDemo{

publicstaticvoidmain(String[]args){

//創(chuàng)建對象

MyGenericMethodmm=newMyGenericMethod();

//演示看方法提示

mm.show("aaa");

mm.show(123);

mm.show(12.45);

}

含有泛型的接口

定義格式:

修飾符interface接口名代表泛型的變量{}

例如:

publicinterfaceMyGenericInterfaceE{

publicabstractvoidadd(Ee);

publicabstractEgetE();

}

使用格式:

1.定義類時確定泛型的類型

例如:

publicclassMyImp1implementsMyGenericInterfaceString{

@Override

publicvoidadd(Stringe){

//省略...

@Override

publicStringgetE(){

returnnull;

}

此時,泛型E的值就是String類型。

2.始終不確定泛型的類型,直到創(chuàng)建對象時,確定泛型的類型

例如:

publicclassMyImp2EimplementsMyGenericInterfaceE{

@Override

publicvoidadd(Ee){

//省略...

@Override

publicEgetE(){

returnnull;

}

確定泛型:

/*

*使用

publicclassGenericInterface{

publicstaticvoidmain(String[]args){

MyImp2Stringmy=newMyImp2String

my.add("aa");

}

泛型通配符

當(dāng)使用泛型類或者接口時,傳遞的數(shù)據(jù)中,泛型類型不確定,可以通過通配符表示。但是一旦使用泛型的通配符后,只能使用Object類中的共性方法,集合中元素自身方法無法使用。

通配符基本使用

泛型的通配符:不知道使用什么類型來接收的時候,此時可以使用,表示未知通配符。此時只能接受數(shù)據(jù),不能往該集合中存儲數(shù)據(jù)。

舉個例子大家理解使用即可:

publicstaticvoidmain(String[]args){

CollectionIntgerlist1=newArrayListInteger

getElement(list1);

CollectionStringlist2=newArrayListString

getElement(list2);

publicstaticvoidgetElement(Collectioncoll){}

//?代表可以接收任意類型

tips:泛型不存在繼承關(guān)系Collection

通配符高級使用----受限泛型

之前設(shè)置泛型的時候,實際上是可以任意設(shè)置的,只要是類就可以設(shè)置。但是在JAVA的泛型中可以指定一個泛型的上限和下限。泛型的上限:

格式:類型名稱extends類對象名稱意義:只能接收該類型及其子類

泛型的下限:

格式:類型名稱super類對象名稱意義:只能接收該類型及其父類型

比如:現(xiàn)已知Object類,String類,Number類,Integer類,其中Number是Integer的父類

publicstaticvoidmain(String[]args){

CollectionIntegerlist1=newArrayListInteger

CollectionStringlist2=newArrayListString

CollectionNumberlist3=newArrayListNumber

CollectionObjectlist4=newArrayListObject

getElement(list1);

getElement(list2);//報錯

getElement(list3);

getElement(list4);//報錯

getElement2(list1);//報錯

getElement2(list2);//報錯

getElement2(list3);

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論