半小時(shí)通透Java的泛型_第1頁(yè)
半小時(shí)通透Java的泛型_第2頁(yè)
半小時(shí)通透Java的泛型_第3頁(yè)
半小時(shí)通透Java的泛型_第4頁(yè)
半小時(shí)通透Java的泛型_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第半小時(shí)通透Java的泛型Exceptioninthread“main”java.lang.ClassCastException:java.lang.Integercannotbecasttojava.lang.String

atcom.caq.oop.demo08.Test.main(Test.java:12)

由于我們的“疏忽”,列表第1個(gè)元素實(shí)際上是整型,但被我們強(qiáng)制轉(zhuǎn)換為字符串類型,這是行不通的,因此會(huì)拋出ClassCastException異常。

使用泛型可以解決這些問題。泛型有如下優(yōu)點(diǎn):

可以減少類型轉(zhuǎn)換的次數(shù),代碼更加簡(jiǎn)潔;

程序更加健壯:只要編譯期沒有警告,運(yùn)行期就不會(huì)拋出ClassCastException異常;

提高了代碼的可讀性:編寫集合的時(shí)候,就限定了集合中能存放的類型。

3.如何使用泛型

3.1泛型使用

在代碼中,這樣使用泛型:

ListStringlist=newArrayListString

//Java7及以后的版本中,構(gòu)造方法中可以省略泛型類型:

ListStringlist=newArrayList();

要注意的是,變量聲明的類型必須與傳遞給實(shí)際對(duì)象的類型保持一致,下面是錯(cuò)誤的例子:

ListObjectlist=newArrayListString

ListNumbernumbers=newArrayList(Integer);

3.2自定義泛型類

3.2.1Java源碼中泛型的定義

在自定義泛型類之前,我們來看下java.util.ArrayList是如何定義的:

類名后面的E就是泛型的定義,E不是Java中的一個(gè)具體的類型,它是Java泛型的通配符(注意是大寫的,實(shí)際上就是Element的含義),可將其理解為一個(gè)占位符,將其定義在類上,使用時(shí)才確定類型。

此處的命名不受限制,但最好有一定含義,例如java.lang.HashMap的泛型定義為HashMapK,V,K表示Key,V表示Value。

3.2.2自定義泛型類實(shí)例1

下面我們來自定義一個(gè)泛型類,自定義泛型按照約定俗成可以叫T,具有Type的含義,實(shí)例如下:

實(shí)例演示

packagecom.caq.List;

publicclassGeneric01T{

privateTabc;//定義在類上的泛型,在類內(nèi)部可以使用

publicTgetAbc(){

returnabc;

publicvoidsetAbc(Tabc){

this.abc=abc;

publicstaticvoidmain(String[]args){

//實(shí)例化對(duì)象,指定元素類型為整型

Generic01IntegerintegerGeneric01=newGeneric01();

//調(diào)用方法

integerGeneric01.setAbc(100);

System.out.println("integerGeneric01="+integerGeneric01.getAbc());

//實(shí)例化對(duì)象,指定元素類型為長(zhǎng)類型

Generic01LonglongGeneric01=newGeneric01();

longGeneric01.setAbc(200L);

System.out.println("longGeneric01="+longGeneric01.getAbc());

//實(shí)例化對(duì)象,指定元素類型為雙精度浮點(diǎn)型

Generic01DoubledoubleGeneric01=newGeneric01();

doubleGeneric01.setAbc(300.0);

System.out.println("doubleGeneric01="+doubleGeneric01.getAbc());

運(yùn)行結(jié)果:

integerGeneric01=100

longGeneric01=200

doubleGeneric01=300.0

我們?cè)陬惖亩x處也定義了泛型:Generic01T;在類內(nèi)部定義了一個(gè)T類型的abc變量,并且為其添加了setter和getter方法。

解釋:對(duì)于泛型類的使用也很簡(jiǎn)單,在主方法中,創(chuàng)建對(duì)象的時(shí)候指定T的類型分別為Integer、Long、Double,類就可以自動(dòng)轉(zhuǎn)換成對(duì)應(yīng)的類型了。

3.2.3自定義泛型類實(shí)例2

上面我們知道了如何定義含有單個(gè)泛型的類,那么對(duì)于含有多個(gè)泛型的類,如何定義呢?

我們可以看一下HashMap類是如何定義的。如下是Java源碼的截圖:

參照HashMapK,V類的定義,下面我們來看看如何定義含有兩個(gè)泛型的類

packagecom.caq.List;

publicclassGeneric02K,V{//這次是定義兩個(gè)泛型在類上

//定義類型為K的key屬型

privateKkey;

//定義類型為V的value屬型

privateVvalue;

//封裝里的知識(shí),通過Getter和Setter方法來設(shè)置和獲取私有屬型的值

publicKgetKey(){

returnkey;

publicvoidsetKey(Kkey){

this.key=key;

publicVgetValue(){

returnvalue;

publicvoidsetValue(Vvalue){

this.value=value;

publicstaticvoidmain(String[]args){

//實(shí)例化對(duì)象,分別指定類型為整型,長(zhǎng)整型

Generic02Integer,LongintegerLongGeneric02=newGeneric02();

//實(shí)例化對(duì)象,分別指定類型為浮點(diǎn)型、字符串類型

Generic02Float,StringfloatStringGeneric02=newGeneric02();

integerLongGeneric02.setKey(100);

integerLongGeneric02.setValue(200L);

System.out.println("key="+integerLongGeneric02.getKey());

System.out.println("value="+integerLongGeneric02.getValue());

floatStringGeneric02.setKey(0.9f);

floatStringGeneric02.setValue("巴啦啦能量");

System.out.println("key="+floatStringGeneric02.getKey());

System.out.println("value="+floatStringGeneric02.getValue());

運(yùn)行結(jié)果:

key=100value=200key=0.9value=巴啦啦能量

3.3自定義泛型方法

前面我們知道了如何定義泛型類,在類上定義的泛型,在方法中也可以使用。下面我們來看一下如何自定義泛型方法。

泛型方法不一定寫在泛型類當(dāng)中。當(dāng)類的調(diào)用者總是關(guān)心類中的某個(gè)泛型方法,不關(guān)心其他屬性,這個(gè)時(shí)候就沒必要再整個(gè)類上定義泛型了。

直接在方法上設(shè)置泛型(generic)

packagecom.caq.List;publicclassGeneric03{publicTvoidtest(Tt){System.out.println(t);}publicstaticvoidmain(String[]args){Generic03generic03=newGeneric03();generic03.test("Monkey");generic03.test(1);generic03.test(1.00000);generic03.test(1L);}}

運(yùn)行結(jié)果:

Monkey11.01

實(shí)例中,使用T來定義test方法的泛型,它接收一個(gè)泛型的參數(shù)變量并在方法體打?。徽{(diào)用泛型方法也很簡(jiǎn)單,在主方法中實(shí)例化對(duì)象,調(diào)用對(duì)象下的泛型方法,可傳入不同類型的參數(shù)。

4.泛型類的子類

泛型類也是一個(gè)Java類,它也具有繼承的特性。

泛型類的繼承可分為兩種情況:

子類明確泛型類的類型參數(shù)變量;

子類不明確泛型類的類型參數(shù)變量。

4.1明確類型參數(shù)變量

例如,有一個(gè)泛型接口:

packagecom.caq.List;publicinterfaceGenericInterface01T{defaultvoidshow(Tt){}}

泛型接口的實(shí)現(xiàn)類如下:

packagecom.caq.List;publicclassGenericInterfaceImpleimplementsGenericInterface01String{@Overridepublicvoidshow(Strings){System.out.println(s);}}

子類實(shí)現(xiàn)明確了泛型的參數(shù)變量為String類型。因此方法show()的重寫也將T替換為了String類型。

4.2不明確類型參數(shù)變量

當(dāng)實(shí)現(xiàn)類不確定泛型類的參數(shù)變量時(shí),實(shí)現(xiàn)類需要定義類型參數(shù)變量,調(diào)用者使用子類時(shí),也需要傳遞類型參數(shù)變量。

如下是GenericInterface接口的另一個(gè)實(shí)現(xiàn)類:

packagecom.caq.List;

publicclassGenericInterfaceImpleTimplementsGenericInterface01T{

@Override

publicvoidshow(Tt){

System.out.println(t);

在主方法中調(diào)用實(shí)現(xiàn)類的show()方法:

packagecom.caq.List;

publicclassGenericInterfaceImpleTimplementsGenericInterface01T

溫馨提示

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

評(píng)論

0/150

提交評(píng)論