




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 英國(guó)監(jiān)護(hù)協(xié)議書范本
- 英文投資分紅合同協(xié)議
- 舞蹈老師簽合同協(xié)議
- 藍(lán)莓基地采摘合同協(xié)議
- 裝修木工勞動(dòng)合同協(xié)議
- 歷屆民法學(xué)試題及答案
- 紡織品檢測(cè)設(shè)備介紹與應(yīng)用試題及答案
- 規(guī)范寫字測(cè)試題及答案
- 四電質(zhì)量選擇試題及答案
- 濟(jì)寧三模語(yǔ)文試題及答案
- 管理學(xué)原理(南大馬工程)
- 設(shè)備點(diǎn)檢基準(zhǔn)書
- 園林植物保護(hù)第二章共36張課件
- 公司鑰匙移交單
- 2023年廣東省高中學(xué)生化學(xué)競(jìng)賽試題與標(biāo)準(zhǔn)答案正式題(word可編輯版)
- DB63-T 1110-2020 青海省綠色建筑評(píng)價(jià)標(biāo)準(zhǔn)-(高清現(xiàn)行)
- 五年級(jí)心理健康教育課件-欣賞自己 全國(guó)通用(共19張PPT)
- JJF1637-2017 廉金屬熱電偶校準(zhǔn)規(guī)范-(高清現(xiàn)行)
- DBJ04∕T 416-2020 農(nóng)村宅基地自建住房技術(shù)指南(標(biāo)準(zhǔn))
- 歸檔范圍和保管期限(8號(hào)令)講解課件
- 瓦斯抽放泵培訓(xùn)PPT課件
評(píng)論
0/150
提交評(píng)論