




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、JavaJava語言程序設(shè)計語言程序設(shè)計信息工程學(xué)院信息工程學(xué)院 信息類專業(yè)課程西北農(nóng)林科技大學(xué)西北農(nóng)林科技大學(xué)第十章 泛型JavaJava語言程序設(shè)計語言程序設(shè)計信息工程學(xué)院信息工程學(xué)院體驗泛型nJdk 1.5Jdk 1.5以前的集合類中存在什么問題以前的集合類中存在什么問題ArrayList collection = new ArrayList();collection.add(1);collection.add(1L);collection.add(abc);int i = (Integer)arrayList.get(1);/int i = (Integer)arrayList.get
2、(1);/編譯要強制類型轉(zhuǎn)換且運行時出錯!編譯要強制類型轉(zhuǎn)換且運行時出錯!nJdk 1.5Jdk 1.5的集合類希望你在定義集合時,明確表示你要向集合中裝哪種類型的數(shù)的集合類希望你在定義集合時,明確表示你要向集合中裝哪種類型的數(shù)據(jù),無法加入指定類型以外的數(shù)據(jù)據(jù),無法加入指定類型以外的數(shù)據(jù)ArrayList collection2 = new ArrayList();collection2.add(1);/*collection2.add(1L);collection2.add(“abc”);*/這兩行代碼編譯時就報告了語法錯誤int i2 = collection2.get(0);/不需要再進
3、行類型轉(zhuǎn)換n泛型是提供給泛型是提供給javacjavac編譯器使用的,可以限定集合中的輸入類型,讓編譯器擋住編譯器使用的,可以限定集合中的輸入類型,讓編譯器擋住源程序中的非法輸入,編譯器編譯帶類型說明的集合時會去除掉源程序中的非法輸入,編譯器編譯帶類型說明的集合時會去除掉“類型類型”信息信息,使程序運行效率不受影響,對于參數(shù)化的泛型類型,使程序運行效率不受影響,對于參數(shù)化的泛型類型,getClass()getClass()方法的返回方法的返回值和原始類型完全一樣。由于編譯生成的字節(jié)碼會去掉泛型的類型信息,只要值和原始類型完全一樣。由于編譯生成的字節(jié)碼會去掉泛型的類型信息,只要能跳過編譯器,就可
4、以往某個泛型集合中加入其它類型的數(shù)據(jù),例如,用反射能跳過編譯器,就可以往某個泛型集合中加入其它類型的數(shù)據(jù),例如,用反射得到集合,再調(diào)用其得到集合,再調(diào)用其addadd方法即可。方法即可。JavaJava語言程序設(shè)計語言程序設(shè)計信息工程學(xué)院信息工程學(xué)院了解泛型ArrayList類定義和ArrayList類引用中涉及如下術(shù)語:整個稱為ArrayList泛型類型ArrayList中的E稱為類型變量或類型參數(shù)整個ArrayList稱為參數(shù)化的類型ArrayList中的Integer稱為類型參數(shù)的實例或?qū)嶋H類型參數(shù)ArrayList中的念著typeofArrayList稱為原始類型參數(shù)化類型與原始類型的
5、兼容性:參數(shù)化類型可以引用一個原始類型的對象,編譯報告警告,例如,Collection c = new Vector();/可不可以,不就是編譯器一句話的事嗎?原始類型可以引用一個參數(shù)化類型的對象,編譯報告警告,例如,Collection c = new Vector();/原來的方法接受一個集合參數(shù),新的類型也要能傳進去參數(shù)化類型不考慮類型參數(shù)的繼承關(guān)系:Vector v = new Vector(); /錯誤!/不寫沒錯,寫了就是明知故犯Vector v = new Vector(); /也錯誤!編譯器不允許創(chuàng)建類型變量的數(shù)組。即在創(chuàng)建數(shù)組實例時,數(shù)組的元素不能使用參數(shù)化的類型,例如,下面
6、語句有錯誤: Vector vectorList = new Vector10;思考題:下面的代碼會報錯誤嗎?Vector v1 = new Vector(); Vector v = v1;JavaJava語言程序設(shè)計語言程序設(shè)計信息工程學(xué)院信息工程學(xué)院泛型中的?通配符問題: 定義一個方法,該方法用于打印出任意參數(shù)化類型的集合中的所有數(shù)據(jù),該方法如何定義呢?錯誤方式:public static void printCollection(Collection cols) for(Object obj:cols) System.out.println(obj);/* cols.add(string
7、);/沒錯 cols = new HashSet();/會報告錯誤!*/正確方式:public static void printCollection(Collection cols) for(Object obj:cols) System.out.println(obj);/cols.add(string);/錯誤,因為它不知自己未來匹配就一定是Stringcols.size();/沒錯,此方法與類型參數(shù)沒有關(guān)系 cols = new HashSet();總結(jié):使用?通配符可以引用其他各種參數(shù)化的類型,?通配符定義的變量主要用作引用,可以調(diào)用與參數(shù)化無關(guān)的方法,不能調(diào)用與參數(shù)化有關(guān)的方法。J
8、avaJava語言程序設(shè)計語言程序設(shè)計信息工程學(xué)院信息工程學(xué)院泛型中的?通配符的擴展限定通配符的上邊界:正確:Vector x = new Vector();錯誤:Vector x = new Vector();限定通配符的下邊界:正確:Vector x = new Vector();錯誤:Vector x = new Vector();提示:限定通配符總是包括自己。JavaJava語言程序設(shè)計語言程序設(shè)計信息工程學(xué)院信息工程學(xué)院泛型集合類的綜合案例能寫出下面的代碼即代表掌握了Java的泛型集合類: HashMap hm = new HashMap(); hm.put(zxx,19); hm.
9、put(lis,18); SetMap.Entry mes= hm.entrySet(); for(Map.Entry me : mes) System.out.println(me.getKey() + : + me.getValue(); 對在jsp頁面中也經(jīng)常要對Set或Map集合進行迭代:$entry.key:$entry.valueJavaJava語言程序設(shè)計語言程序設(shè)計信息工程學(xué)院信息工程學(xué)院由C+的模板函數(shù)引入自定義泛型如下函數(shù)的結(jié)構(gòu)很相似,僅類型不同:int add(int x,int y) return x+y;float add(float x,float y) retur
10、n x+y;double add(double x,double y) return x+y;C+用模板函數(shù)解決,只寫一個通用的方法,它可以適應(yīng)各種類型,示意代碼如下:template T add(T x,T y) return (T) (x+y);JavaJava語言程序設(shè)計語言程序設(shè)計信息工程學(xué)院信息工程學(xué)院定義泛型方法Java的泛型方法沒有C+模板函數(shù)功能強大,java中的如下代碼無法通過編譯: T add(T x,T y) return (T) (x+y);/return null;用于放置泛型的類型參數(shù)的尖括號應(yīng)出現(xiàn)在方法的其他所有修飾符之后和在方法的返回類型之前,也就是緊鄰返回值之
11、前。按照慣例,類型參數(shù)通常用單個大寫字母表示。交換數(shù)組中的兩個元素的位置的泛型方法語法定義如下:static void swap(E a, int i, int j) E t = ai;ai = aj;aj = t;只有引用類型才能作為泛型方法的實際參數(shù),swap(new int3,3.5);語句會報告編譯錯誤。除了在應(yīng)用泛型時可以使用extends限定符,在定義泛型時也可以使用extends限定符,例如,Class.getAnnotation()方法的定義。并且可以用&來指定多個邊界,如 void method()普通方法、構(gòu)造方法和靜態(tài)方法中都可以使用泛型。也可以用類型變量表示異常
12、,稱為參數(shù)化的異常,可以用于方法的throws列表中,但是不能用于catch子句中。在泛型中可以同時有多個類型參數(shù),在定義它們的尖括號中用逗號分,例如:public static V getValue(K key) return map.get(key);JavaJava語言程序設(shè)計語言程序設(shè)計信息工程學(xué)院信息工程學(xué)院泛型方法的練習(xí)題編寫一個泛型方法,自動將Object類型的對象轉(zhuǎn)換成其他類型。定義一個方法,可以將任意類型的數(shù)組中的所有元素填充為相應(yīng)類型的某個對象。采用自定泛型方法的方式打印出任意參數(shù)化類型的集合中的所有內(nèi)容。在這種情況下,前面的通配符方案要比范型方法更有效,當(dāng)一個類型變量用來
13、表達兩個參數(shù)之間或者參數(shù)和返回值之間的關(guān)系時,即同一個類型變量在方法簽名的兩處被使用,或者類型變量在方法體代碼中也被使用而不是僅在簽名的時候使用,才需要使用范型方法。定義一個方法,把任意參數(shù)類型的集合中的數(shù)據(jù)安全地復(fù)制到相應(yīng)類型的數(shù)組中。定義一個方法,把任意參數(shù)類型的一個數(shù)組中的數(shù)據(jù)安全地復(fù)制到相應(yīng)類型的另一個數(shù)組中。JavaJava語言程序設(shè)計語言程序設(shè)計信息工程學(xué)院信息工程學(xué)院類型參數(shù)的類型推斷編譯器判斷范型方法的實際類型參數(shù)的過程稱為類型推斷,類型推斷是相對于知覺推斷的,其實現(xiàn)方法是一種非常復(fù)雜的過程。根據(jù)調(diào)用泛型方法時實際傳遞的參數(shù)類型或返回值的類型來推斷,具體規(guī)則如下:當(dāng)某個類型變量
14、只在整個參數(shù)列表中的所有參數(shù)和返回值中的一處被應(yīng)用了,那么根據(jù)調(diào)用方法時該處的實際應(yīng)用類型來確定,這很容易憑著感覺推斷出來,即直接根據(jù)調(diào)用方法時傳遞的參數(shù)類型或返回值來決定泛型參數(shù)的類型,例如: swap(new String3,3,4) static void swap(E a, int i, int j)當(dāng)某個類型變量在整個參數(shù)列表中的所有參數(shù)和返回值中的多處被應(yīng)用了,如果調(diào)用方法時這多處的實際應(yīng)用類型都對應(yīng)同一種類型來確定,這很容易憑著感覺推斷出來,例如: add(3,5) static T add(T a, T b) 當(dāng)某個類型變量在整個參數(shù)列表中的所有參數(shù)和返回值中的多處被應(yīng)用了,如
15、果調(diào)用方法時這多處的實際應(yīng)用類型對應(yīng)到了不同的類型,且沒有使用返回值,這時候取多個參數(shù)中的最大交集類型,例如,下面語句實際對應(yīng)的類型就是Number了,編譯沒問題,只是運行時出問題: fill(new Integer3,3.5f) static void fill(T a, T v) 當(dāng)某個類型變量在整個參數(shù)列表中的所有參數(shù)和返回值中的多處被應(yīng)用了,如果調(diào)用方法時這多處的實際應(yīng)用類型對應(yīng)到了不同的類型, 并且使用返回值,這時候優(yōu)先考慮返回值的類型,例如,下面語句實際對應(yīng)的類型就是Integer了,編譯將報告錯誤,將變量x的類型改為float,對比eclipse報告的錯誤提示,接著再將變量x類型
16、改為Number,則沒有了錯誤: int x =(3,3.5f) static T add(T a, T b) 參數(shù)類型的類型推斷具有傳遞性,下面第一種情況推斷實際參數(shù)類型為Object,編譯沒有問題,而第二種情況則根據(jù)參數(shù)化的Vector類實例將類型變量直接確定為String類型,編譯將出現(xiàn)問題:copy(new Integer5,new String5) static void copy(T a,T b);copy(new Vector(),new Integer5) static void copy(Collection a ,T b);JavaJava語言程序設(shè)計語言程序設(shè)計信息工程學(xué)
17、院信息工程學(xué)院定義泛型類型如果類的實例對象中的多處都要用到同一個泛型參數(shù),即這些地方引用的泛型類型要保持同一個實際類型時,這時候就要采用泛型類型的方式進行定義,也就是類級別的泛型,語法格式如下:public class GenericDao private T field1;public void save(T obj)public T getById(int id)類級別的泛型是根據(jù)引用該類名時指定的類型信息來參數(shù)化類型變量的,例如,如下兩種方式都可以:GenericDao dao = null;new genericDao();注意:在對泛型類型進行參數(shù)化時,類型參數(shù)的實例必須是引用類型,
18、不能是基本類型。當(dāng)一個變量被聲明為泛型時,只能被實例變量和方法調(diào)用(還有內(nèi)嵌類型),而不能被靜態(tài)變量和靜態(tài)方法調(diào)用。因為靜態(tài)成員是被所有參數(shù)化的類所共享的,所以靜態(tài)成員不應(yīng)該有類級別的類型參數(shù)。問題:類中只有一個方法需要使用泛型,是使用類級別的泛型,還是使用方法級別的泛型?JavaJava語言程序設(shè)計語言程序設(shè)計信息工程學(xué)院信息工程學(xué)院通過反射獲得泛型的參數(shù)化類型一段代碼: Class GenericalReflection private Vector dates = new Vector(); public void setDates(Vector dates) this.dates = dates; public static void main(String args) final Method methods = GenericalReflection.class.getMethods(); for (final Method m : methods) if (m.getName().equals(setDates) final ParameterizedType pType = (ParameterizedType)(m.g
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度房屋贈與與藝術(shù)收藏合同模板
- 2025年度婚內(nèi)房產(chǎn)贈與協(xié)議書(夫妻雙方共同簽署)
- 2025年度雙方承諾協(xié)議書:網(wǎng)絡(luò)安全與信息保護合作協(xié)議范文
- 2025年度快遞物流運輸網(wǎng)絡(luò)優(yōu)化合作協(xié)議
- 2025年度打架雙方和解協(xié)議書模板(含環(huán)境修復(fù)責(zé)任)
- 第二單元第8課《無線通信》教學(xué)設(shè)計 2023-2024學(xué)年浙教版(2020)初中信息技術(shù)八年級下冊
- Module 10 the weather unit 2 the weather is fine all year around 教學(xué)設(shè)計-2024-2025學(xué)年外研版英語八年級上冊
- 2025年四氫苯酐項目合作計劃書
- 玻璃雕銑機項目績效評估報告
- 青霉-鏈格孢菌共代謝天然產(chǎn)物和結(jié)構(gòu)衍生物抗帕金森病模型細胞氧化損傷研究
- 安全主任在2025年春季開學(xué)典禮上的講話稿
- 部編版語文小學(xué)二年級下冊第一單元集體備課(教材解讀)
- 房屋市政工程生產(chǎn)安全重大事故隱患判定標(biāo)準(zhǔn)(2024版)宣傳畫冊
- 高等傳熱學(xué)全冊課件
- 《冷沖壓工藝與模具設(shè)計》完整版ppt課件全套教程
- 業(yè)務(wù)招待費明細單
- 高效液相色譜法分析(三聚氰胺)原始記錄1
- 典雅中國風(fēng)詩詞大會古風(fēng)PPT模板
- Part 7 Formal and Informal Styles課件
- 文化差異及跨文化交際試題集
- 油畫人體張東方姑娘的極致美
評論
0/150
提交評論