Java語言基礎(chǔ)特性—第一部分(下)-Java開發(fā)Java經(jīng)驗技巧_第1頁
Java語言基礎(chǔ)特性—第一部分(下)-Java開發(fā)Java經(jīng)驗技巧_第2頁
Java語言基礎(chǔ)特性—第一部分(下)-Java開發(fā)Java經(jīng)驗技巧_第3頁
Java語言基礎(chǔ)特性—第一部分(下)-Java開發(fā)Java經(jīng)驗技巧_第4頁
Java語言基礎(chǔ)特性—第一部分(下)-Java開發(fā)Java經(jīng)驗技巧_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡介

1、java語言基礎(chǔ)特性一第一部分(下)-編程開發(fā)技術(shù)java語言基礎(chǔ)特性一第一部分(下)木文由importnew陳曉舜翻譯自javaworldo歡迎加入翻譯小組。轉(zhuǎn)載請見文末要求。你可以通過指定extends后接類型名稱來提供通配符的上界。同樣的,你可以通 過指定super fu接類型名稱來提供通配符的卜界。這些限定限制了可以作為實際 類型參數(shù)傳入的類型。在例了中,你可以把? extends string理解為任何string或其了類的實際類型 參數(shù)。同樣的,你可以把? super string理解為任何string或其父類的實際類 型參數(shù)。因為string是final的,這意味著它不能被繼承,

2、只有源列表為string 對彖,口標(biāo)列表為string或object對彖能夠傳入作為參數(shù),這樣用處不大。你可以使用泛型方法來完全解決這個問題,它是一個冇類型實現(xiàn)參數(shù)的類或接口 方法。泛型方法支持下面的語法:<formaltypeparameterli st> returntype ident if icr(paramctcrlist)泛型方法的形參列表在它的返回類型之前。它包含類型參數(shù)和可選的上界。類型 參數(shù)可以作為返回類型使用,并且可以出現(xiàn)在參數(shù)列表中。清單9展示了怎么定義和調(diào)用泛型copy ()方法import importlisting 9. gendemo. java (v

3、ersion 5) java. util. arra)list;java. util. list;public static void main(string args)list<tnteger> grades = new arraylist<tnteger>();integer gradevalues =new integer (96),new integer (95),new integer(27),new integer(100),new integer(43),new integer(68);for (int i 二 0; i gradevalues. leng

4、th; i+) grades, add(gradevaluesi);list<lnteger> failedgrades = new arraylist<lnteger>(); copy (grades, failedgrades, new filter<integer> () public boolean accept (integergrade)return grade. intvalue() <=50;);for (int i = 0; i < failedgradessizc(); i+) system, out. printin(fai

5、ledgrades. get (i);staticfiltcr<t>for<t> void copy(list<t> src, list<t> dest, filter)(int i = 0; i < src. size() ; i+)if (filter, accept (src. get (i) dest. add (src. get (i);interface filter<t>boolcan accept(t o);清單 9 中我定義了一個t> void copy (list<t> src, list&

6、lt;t> dest, filter<t> filter)泛型方法。編譯器注意到src, dest和filter參數(shù)的類型都包含類型參 數(shù)t。這意味著在方法調(diào)用中必須傳入同樣的實際類型參數(shù),而編譯器會在調(diào)用 小獲取參數(shù)。如果你編譯清單9 (javac gendemo. java)并運行程序(java gendemo),你應(yīng) 該可以看到下面的輸出:2743java語言中關(guān)于泛型最有爭議的是什么?雖然泛型木身并不具爭議,但它在java語言中的特殊實現(xiàn)卻是。泛型是作為消 除轉(zhuǎn)換的語法糖的編譯時特性來實現(xiàn)的。編譯器會在編譯源碼后丟棄泛型類型或 泛型的形參類型列表。這個“丟棄”行為稱為

7、擦除(erasure)。其他在泛型中 關(guān)于擦除的例子包含:在代碼類型不正確時,插入時可以自動轉(zhuǎn)換為合適的類型; 通過上界(例如object)來替換類型參數(shù)。更多關(guān)于泛型的討論泛型不只因為擦除而備受爭議。看一下stackoverflow. com的“為 什么我們抱怨j3v3關(guān)于泛型的實現(xiàn)很糟糕”主題的討論,包含了 通配符很難理解和事實上泛型并不直接值類型(例如,你不能指定 list<int>) o使用擦除會有下面的幾個限制: instanceof并不能用于參數(shù)化類型,只冇一種情況是例外的。這個例外 就是無界的通配符。例如,你不能指定sct<shapc> shapes =

8、null; if (shapes instanceof arraylist<shape>) o 相反,你需要把對 instanceof 表達(dá)式修改為 shapes instanceof arraylist<?>,這種就是 無界的通配符。或者,你可以指定shapes instanceof arraylist,這使 用的是原生類型(通常也是推薦使用的做法)。編譯器把泛型代碼轉(zhuǎn)換為非泛型代碼,并保存在class文件中。一些開發(fā) 人員指出擦除會使得你不能通過反射取得泛型信息,因為它們并不保存在 class文件中。開發(fā)人員jakob jenkov在“java反射:泛型”中指出一

9、些泛型信息會被保存在class文件屮的情況,并且這些信息可以通過反射 來訪問。你不能在創(chuàng)建數(shù)組的表達(dá)式中使用類型參數(shù);例如,elements = newesize ;o如果你這樣做,編譯器會報告泛型數(shù)組創(chuàng)建錯誤信息。鑒于擦除的限制,你會奇怪為什么泛型要通過擦除來實現(xiàn)。原因很簡單:java 編譯器被重構(gòu)來使用擦除,因此泛型代碼可以跟那些非泛型的遺留代碼進(jìn)行交 互。沒冇這個向后兼容性,遺留代碼在支持泛型的java編譯器上編譯時將會報 錯。第一部分總結(jié)java語言已經(jīng)添加了許多新特性。在這篇文章屮,我展示了怎么使用斷言來增 強你在代碼正確性上的信心,和如何使用泛型來消除classcastexcept

10、iono通 過使用斷言和泛型,你可以編寫更可靠的代碼,并且使你的代碼在運行時的錯誤 降到最低,當(dāng)然,也減少而對生氣的客戶時的頭痛了。java 5是java平臺丿力史上的一個重大發(fā)布,雖然泛型比其他特性都更具爭議, 但它卻比其他都更加重要。我的下篇文章將會介紹另外7個在java5時加入的必 要的特性:類型安全的枚舉,注解,自動裝箱和拆箱,加強的循環(huán),靜態(tài)引入, 可變參數(shù),協(xié)變返回類型。在那之前,下載這篇文章的源代碼,它包含了更多的 關(guān)于斷言和泛型的提示和例了。jeff friesen是一個自由職業(yè)導(dǎo)師和側(cè)重java和android的軟件開發(fā)人員。除 了為 apress java 和 androi

11、d 書籍,jeff 為 javaworld, in form it, java, net, devsource和sitepoint寫了大量的關(guān)于java和其他技術(shù)的文章。你可以通過 他在tutortutor. ca的網(wǎng)站聯(lián)系到他了解更多主題相關(guān)下載文章的源代碼閱讀angelika langer的java generics faqs,那里有著大量的關(guān)于java語言 泛型的信息和觀點。對于想學(xué)習(xí)ja腹語言和它的備受爭議的特性的,langer的文章理解閉包的爭論 (2008. 6 java world)對比了 java 7語言中的三個關(guān)于添加閉包和lambda表達(dá) 式的初始提議??梢圆榭础癹ava反

12、射:泛型” (jakob jenkov, jenkov. com)關(guān)于泛型反射和某 些情況下可以在運行時獲取泛型信息的討論。java無痛并發(fā)編程,第一部(2013. 6):介紹了 executor框架,同步類型和java 并發(fā)集合包。java無痛并發(fā)編程,第二部(2013.8):介紹了鎖,原子變量和fork/join操 作,還附加了 java8中關(guān)于java. util, concurrent的修改概述。跟± java date 和 time api (2013.4):介紹了 java8 的 jsr310: date 和 time apt,并且展示了你最有可能使用的java, time系列類的使用。javaworld中更多關(guān)于java集合框架的文章:java集合框架從零開始(1998. 11 dan becker):這篇文章介紹了集合剛引入 java時的歷史。java集合中的省時習(xí)慣(

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論