




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
JAVA高級(jí)特性1第六章
泛型和注解2回憶Class對象提供了大量訪問類的內(nèi)部結(jié)構(gòu)的方法。如何訪問這些信息?java.lang.reflect包還提供了用于動(dòng)態(tài)代理的類和接口分別是什么?如何使用CGLIB實(shí)現(xiàn)動(dòng)態(tài)代理模式?3本章內(nèi)容Annotation的概念和作用根本注解、元注解和自定義注解提取注解信息定義泛型接口、泛型類、泛型方法類型通配符和通配符限定擦除4理解java注解的概念和作用掌握注解的使用掌握提取注解信息掌握泛型的使用掌握通配符的使用本章目標(biāo)5根本注解@Override:指定方法重寫,強(qiáng)制一個(gè)子類必須重寫父類的方法。只能作用于方法,不能作用于其他元素。@Deprecated:用于標(biāo)記某個(gè)程序元素已過時(shí),當(dāng)其他程序使用已過時(shí)的類、方法時(shí),編譯器將會(huì)給出警告@SuppressWarnings:抑制編譯器警告。6根本注解強(qiáng)制子類重寫父類方法,如果沒有重寫會(huì)出現(xiàn)編譯錯(cuò)誤publicclassPerson{ publicvoidinfo(){ System.out.println("這是Person類的對象"); }}publicclassStudentextendsPerson{ @Override publicvoidinfo(){ System.out.println("這是Student類的對象"); }}7根本注解被@Deprecated修飾的方法會(huì)出現(xiàn)過時(shí)標(biāo)記,即方法名上出現(xiàn)一條刪除線
@Deprecated publicvoidpaly(){ System.out.println("這個(gè)方法已過時(shí)");
}8根本注解在程序中使用沒有泛型限制的集合將會(huì)引起編譯器警告,可以使用@SuppressWarnings忽略警告
@SuppressWarnings("unchecked")
classSuppressWaringsTest{ publicstaticvoidmain(String[]args){ List<String>list=newArrayList(); }
}9元注解除了三個(gè)根本注解之外,java還提供了四中元注解,元注解專職負(fù)責(zé)注解其他注解10元注解@Target可用的ElementType參數(shù)包括:11元注解@Retention可選的RetentionPolicy參數(shù)包括:12自定義注解定義新的Annotation類型使用@interface關(guān)鍵字語法:例如:[元注解]public@interface注解名稱{[成員變量]}public@interfaceMyAnnotation{}上面代碼定義一個(gè)注解MyAnnotation,該注解默認(rèn)保存在class文件中,可用于修飾程序中的類、方法、變量、接口等的定義。13自定義注解我們根據(jù)Annotation是否包含成員變量,可以把Annotation分為兩類:標(biāo)記Annotation和元數(shù)據(jù)Annotation。標(biāo)記Annotation:一個(gè)沒有成員定義的Annotation類型被稱為標(biāo)記。這種Annotation僅使自身的存在與否來為我們提供信息。如@Override等。元數(shù)據(jù)Annotation:那些包含成員變量的Annotation,因?yàn)樗麄兛梢越邮芨嗟脑獢?shù)據(jù),所以也被稱為元數(shù)據(jù)Annotation。14自定義注解定義帶成員變量的Annotation例如:@Retention(RetentionPolicy.RUNTIME)//指定該注解為運(yùn)行時(shí)注解public@interfaceMyAnnotation{ Stringname(); intage();}publicclassStudent{ @MyAnnotation(name="張飛",age=18) publicvoidinfo(){}}@Retention(RetentionPolicy.RUNTIME)public@interfaceMyAnnotation{ Stringname()default"張三"; intage()default18;}給成員變量指定默認(rèn)值15提取注解信息AnnotatedElement接口是所有程序元素〔如Class、Method〕的父接口,程序通過反射獲取了某個(gè)類的AnnotatedElement對象之后,就可以通過該對象的方法來訪問Annotation信息。classDemo{ publicstaticvoidmain(String[]args){ Studentstudent=newStudent(); try{ Annotation[]aArray=student.getClass().getMethod("info").getAnnotations(); for(Annotationan:aArray){ System.out.println(an); } }catch(Exceptione){ e.printStackTrace(); } }}16提取注解信息如果我們需要獲取某個(gè)注解里的元數(shù)據(jù),那么可以將注解類型強(qiáng)制轉(zhuǎn)換成所需的注解類型,然后通過注解對象的抽象方法來訪問這些元數(shù)據(jù)。例如:publicstaticvoidmain(String[]args){Studentstudent=newStudent();try{ Annotation[]aArray=student.getClass().getMethod("info").getAnnotations(); for(Annotationan:aArray){
//判斷注解類型
if(aninstanceofMyAnnotation){
System.out.println("Annotationis:"+an); //將注解類型強(qiáng)制轉(zhuǎn)換為MyAnnotation
System.out.println("():"+((MyAnnotation)an).name());
System.out.println("an.age():"+((MyAnnotation)an).age()); } }}catch(Exceptione){ e.printStackTrace();}}17泛型Java的集合有個(gè)缺點(diǎn):當(dāng)我們把一個(gè)對象“丟進(jìn)”集合里后,集合就會(huì)“忘記”這個(gè)對象的數(shù)據(jù)類型,當(dāng)再次取出該對象時(shí),該對象的編譯類型就變成了Object類型。為了解決這個(gè)問題,從JDK1.5以后,Java引入了“參數(shù)化類型〔parametrizedtype〕”的概念,允許我們在創(chuàng)立集合時(shí)指定集合元素的類型。如List<String>,這說明該List集合只能保存字符串類型的對象。Java的參數(shù)化類型被稱為泛型〔Generic〕。18定義泛型接口、類泛型允許在定義接口、類時(shí)指定類型形參,類型形參在整個(gè)接口、類中可當(dāng)成類型使用。//定義接口時(shí)指定類型形參:EpublicinterfaceList<E>{ //在接口中,E可以作為類型使用 voidadd(Ee); Iterator<E>iterator();}19定義泛型接口、類當(dāng)我們使用List類型時(shí),為形參E傳入String類型實(shí)參,那么產(chǎn)生了一個(gè)新的類型:List<String>類型,我們可以把List<String>想象成E被替換成String的特殊List子接口:程序雖然定義了一個(gè)List<E>接口,但實(shí)際使用時(shí)可以產(chǎn)生無數(shù)多個(gè)List接口,只要為E傳入不同的類型參數(shù),系統(tǒng)就會(huì)多出一個(gè)新的List子接口注意:“ListString”只是邏輯上存在,物理上并不存在。publicinterfaceListStringextendsList{ //原來的形參E全部變成String類型實(shí)參 voidadd(Strings); Iterator<String>iterator();}20定義泛型接口、類publicclassApple<T>{ privateTinfo;//T可以作為類型在類中使用 publicApple(){} publicApple(Tinfo){ =info; } publicTgetInfo(){ returninfo; } publicvoidsetInfo(Tinfo){ =info; } publicstaticvoidmain(String[]args){ //如果傳遞給T的實(shí)參是String類型,所以構(gòu)造器的參數(shù)只能是String Apple<String>a1=newApple<String>("蘋果"); System.out.println(a1.getInfo()); //如果傳遞給T的實(shí)參是Double類型,所以構(gòu)造器的參數(shù)只能是Double Apple<Double>a2=newApple<Double>(5.6); System.out.println(a2.getInfo()); }}構(gòu)造器不要增加泛型聲明21定義泛型接口、類當(dāng)創(chuàng)立了帶泛型聲明的接口、父類之后,可以為該接口創(chuàng)立實(shí)現(xiàn)類,或從該父類派生子類,但是當(dāng)使用這些接口、父類時(shí)不能再包含類型參數(shù)。例如下面的代碼就是錯(cuò)誤的:這就好比我們定義方法的時(shí)候可以使用形參,但調(diào)用方法時(shí)必須傳入實(shí)參。所以我們需要把上面代碼的T換成實(shí)際類型。上面的代碼應(yīng)改為:classAextendsApple<T>{}classAextendsApple<String>{}//傳入String類型classAextendsApple{}//不傳入實(shí)際參數(shù)也正確22深入泛型當(dāng)我們使用一個(gè)泛型類時(shí),應(yīng)該為這個(gè)泛型類傳入一個(gè)類型實(shí)參,如果沒有傳入實(shí)參,就會(huì)引起泛型警告publicvoidtest(Listc){ for(inti=0;i<c.size();i++){ System.out.println(c.get(i)); }}泛型警告23類型通配符為了表示各種泛型List的父類,我們需要使用類型通配符,類型通配符是一個(gè)問號(hào)“?”,將一個(gè)問號(hào)作為類型實(shí)參傳給List集合,寫作:List<?>〔意思是未知類型元素的List〕。這個(gè)?被稱為通配符,它可以匹配任何類型。List<?>是任何泛型List的父類型publicvoidtest(List<?>c){ for(inti=0;i<c.size();i++){ System.out.println(c.get(i)); }}類型通配符24類型通配符上限當(dāng)直接使用List<?>這種形式時(shí),即說明這個(gè)List集合可以是任何泛型List的父類。但還有一種特殊的情形,我們只想表示它是某一類泛型的父類例如:publicabstractclassShape{ publicabstractvoiddraw(Canvasc);}classCircleextendsShape{ publicvoiddraw(Canvasc){ System.out.println("在畫布上畫一個(gè)圓"); }}classRectangleextendsShape{ publicvoiddraw(Canvasc){ System.out.println("在畫布上畫一個(gè)矩形"); }}classCanvas{ publicvoiddrawAll(List<Shape>shapes){ for(Shapes:shapes){ s.draw(this); } } publicstaticvoidmain(String[]args){ List<Circle>circleList=newArrayList<Circle>();
circleList.add(newCircle()); Canvasc=newCanvas(); c.drawAll(circleList); }}List<Circle>并不是List<Shape>的子類,編譯錯(cuò)誤!25類型通配符上限為了解決上述問題,可以修改代碼如下:通配符可以保證編譯通過,但帶來了類型平安問題classCanvas{ publicvoiddrawAll(List<?>shapes){ for(Shapes:shapes){ s.draw(this); } } publicstaticvoidmain(String[]args){ List<Circle>circleList=newArrayList<Circle>();
circleList.add(newCircle()); Canvasc=newCanvas(); c.drawAll(circleList); }}使用通配符,表示任意類型如果傳遞進(jìn)來的不是Shape,會(huì)發(fā)生類型轉(zhuǎn)換異常問題26類型通配符上限實(shí)際上,我們需要一種泛型表示方法,它可以表示所有Shape泛型List的父類而不是所有泛型List的父類。為了滿足這種需求,Java泛型提供了被限制的通配符語法:List<?extends被限制的類型名稱>publicvoiddrawAll(List<?extendsShape>shapes){ for(Shapes:shapes){ s.draw(this); }}泛型信息匹配Shape的子類27泛型方法JDK1.5還提供了泛型方法的支持。例如:將一個(gè)Object數(shù)組的所有元素添加到一個(gè)Collection集合中。類型通配符在這里是不適用的,因?yàn)闊o法將對象添加到不知道具體類型的集合中staticvoidfromArrayToCollection(Object[]objs,Collection<Object>c){ for(Objecto:objs){ c.add(o); }}只能添加Object類型,不能添加其他類型28泛型方法語法:修改前面代碼:與接口、類定義的類型形參相比,泛型方法定義的類型形參只能在方法內(nèi)部使用修飾符<T,S>返回值類型方法名〔形參列表〕{}static<T>voidfromArrayToCollection(T[]a,Collection<T>c){ for(To:a){ c.add(o); }}29泛型方法前面代碼編譯器根據(jù)實(shí)參可以推斷出最直接的類型形參的類型。為了讓編譯器能夠準(zhǔn)確的推斷出泛型方法中類型形參的類型,不要制造迷惑!
static<T>voidtest(Collection<T>a,Collection<T>b){ for(To:a){ b.add(o); } } publicstaticvoidmain(String[]args){ List<Object>objList=newArrayList<Object>(); List<String>strList=newArrayList<String>(); //這里將發(fā)生編譯錯(cuò)誤 test(strList,objList);
}
static<T>voidtest(Collection<?extendsT>a,Collection<T>b){ for(To:a){ b.add(o); } } publicstaticvoidmain(String[]args){ List<Object>objList=newArrayList<Object>(); List<String>strList=newArrayList<String>(); test(strList,objList); }通配符限定30類型通配符下限前面所使用的test方法可以將集合a中的元素復(fù)制到集合b,假設(shè)該方法還需要一個(gè)返回值,返回最后一個(gè)被復(fù)制的元素,修改該方法如下:static<T>Ttest(Collection<?extendsT>a,Collection<T>b){ Tlast=null; for(To:a){ last=o; b.add(o); } returnlast;}publicstaticvoidmain(String[]args)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 智能能源交易平臺(tái)建設(shè)協(xié)議
- 我最想做的一件事作文范文(9篇)
- 2025至2030甲烷氣體探測器行業(yè)市場深度研究與戰(zhàn)略咨詢分析報(bào)告
- 二零二五版高端化妝品全國總代理銷售合作協(xié)議
- 二零二五年度餐飲店面租賃合同及特色菜品研發(fā)及推廣協(xié)議
- 二零二五年度不動(dòng)產(chǎn)抵押借款合同風(fēng)險(xiǎn)評(píng)估與管理協(xié)議
- 2025年高端制造企業(yè)搬廠勞務(wù)合同細(xì)則
- 二零二五年度辦公用品定制設(shè)計(jì)制作合同
- 二零二五年度環(huán)保型車輛采購與推廣合同
- 小學(xué)二年級(jí)數(shù)學(xué)上冊應(yīng)用題(解決問題)專項(xiàng)練習(xí)(每日一練共27份)
- 檢查檢驗(yàn)管理制度
- 護(hù)理實(shí)習(xí)生供應(yīng)室
- 陰道壁膨出的臨床護(hù)理
- 語文-40首必背古詩詞(易錯(cuò)字標(biāo)注+挖空訓(xùn)練+情境式默寫)(學(xué)生版+教師版)
- 叉車教學(xué)課件教學(xué)課件
- 貴陽出租車駕駛員從業(yè)資格證(區(qū)域)考試總題庫(含答案)
- 游樂場游樂園安全生產(chǎn)責(zé)任制
- ISO∕IEC 27014-2020 信息安全、網(wǎng)絡(luò)安全與隱私保護(hù)-信息安全治理(中文版-雷澤佳譯2024)
- 安徒生童話《樅樹》
- 房產(chǎn)測量規(guī)范
- 蓄滯洪區(qū)設(shè)計(jì)規(guī)范(2021年版)-標(biāo)準(zhǔn)全文
評(píng)論
0/150
提交評(píng)論