關於Java泛型的新解

來源:互聯網
上載者:User

標籤:集合類   style   存在   入門   arraylist   jsp頁面   適應   無法   cal   

////////////////////////////////////////////////////////////////////////////////為了方便您的觀看,請在web版式視圖在觀看本文章。//////////////////////////////////////////////////////////////////////////////////////////////

《關於泛型》

-----------------------------------à入門泛型的基本應用

$1.體驗泛型

泛型是JDK1.5的所有新特性中最難深入透徹掌握的部分。不過,我們在實際應用中不能掌握得那麼深入,掌握泛型中一些最基本的內容就差不多了。沒有使用泛型時,只要是對象,不管是什麼類型的對象,都可以儲存進同一個集合中。使用泛型集合,可以將一個集合的元素限定為一個特定類型,集合中只能儲存同一個類型的對象。這樣就更加安全,並且在從集合中擷取一個對象的時候,編譯器也可以知道這個對象的類型,不需要對對象進行強制轉換。這樣使得程式員更加方便。

  

  ※ JDK1.5以前的集合類中存在什麼問題?

 

※ JDK1.5的集合類型希望在定義集合的時候,明確表示要向集合中裝哪種類型的資料,無法加入指定類型以外的資料。

※  泛型是提供給javac編輯器使用的,可以限定集合中的輸入類型,讓編譯器擋住來源程式的非法輸入,編譯器編輯帶類型說明的集合時,會去除掉‘類型’資訊。使程式啟動並執行效果不受到影響,對於參數化的泛型型別,getClass()方法傳回值和原始類型是完全一樣的。由於編譯產生的位元組碼會去除掉泛型的類型資訊,只要能跳過編譯器,就可以往某個泛型集合中加入其他類型的資料。例如:用反射得到集合,再調用其他add()方法即可。

 

$2.泛型的內部原理及應用(更深層級理解)

 ※ 瞭解泛型

      ○ArrayList<E>類定義和ArrayList<Integer>類引用中涉及到的術語有如下:

 

□整個稱ArrayList<E>為 泛型型別。

□ArrayList<E>中的E稱為 類型變數或者型別參數
□整個ArryList<Integer>稱為 參數化類別型。

□ArrayList<Integer>中的Integer稱為 型別參數的執行個體或者執行個體參數。

□ArratList<Integer>中的 <> 讀作 typeof。

□ArrayList成為原始類型。

※ 參數化型別與原始類型的相容性

 

     ○參數化類別型可以引用一個原始類型的對象,編譯會報警示告,例如:

 

 

 

 ○原始類型可以引用一個參數化類別型,編譯會報告錯誤,例如:

 

 ○參數化型別不考慮型別參數的繼承關係。

 

○在建立數組執行個體時,數組元素是不能使用參數化類別型的,例如:

○思考下列的代碼是否會報錯?

$2.泛型的萬用字元擴充應用

 

※ 泛型中的  ? 萬用字元

 

○問題:          定義一個方法:該方法用於列印任意參數類型的集合中的所有資源,該方法該如何去定義呢?

   

 ▼錯誤方式:

▼正確方式:

 

○總結:

    

       使用 ? 萬用字元可以引用其他各種參數化類別型,?萬用字元定義的變數主要用作引用,可以調用與參數化無關的方法,不能調用與參數化有關的方法。

※ 泛型中的  ? 萬用字元 的擴充

   

○限定萬用字元的上邊界。

  

▼正確方式:

▼錯誤方式:

○限定萬用字元的下邊界。

   

▼正確方式:

▼錯誤方式:

○提示:

   ◆限定萬用字元總是包括自己的。

----------------------------------------------------------------------------

 

$3.泛型集合的綜合案例。

 

○能寫出下面的代碼即 代表 已經掌握了java的泛型基本類:

○對在jsp頁面中也經常要對Set或者Map集合進行迭代:

$4.自訂泛型方法及其應用

 

○由C++的模板函數引入自訂泛型

  ◆如下函數的結構很相似,僅類型不同

 

  ◆C++模板函數解決,唯寫一個通用的方法,它可以適應各種類型,示意代碼如下:

 

 

 

 

○java中的泛型型別(或者泛型)類似於C++中的模板。但是這種相似性僅限於表面。Java語言中的泛型基本上是完全在編譯器中實現, 用於編譯器執行類型檢查和類型判斷,然後產生普通的非泛型的位元組碼。這種實現技術被稱為擦除(erasure)(編譯器使用泛型資訊保證型別安全,然後再產生位元組碼之前將其清除)。 這是因為擴充虛擬機器指令集來支援泛型被認為是無法接受的,這會為java廠商升級其JVM造成難以逾越的障礙。所以,java的泛型採用了可以完全在編譯器中實現的擦除方法。

例如:下面的這兩種方法,編譯器會報告錯誤,它不認為是兩個不同的參數類型,而認為是同一種參數類型,所以不能做到 方法的重載。

 

 

 

 

$5.定義泛型方法

 ○java的泛型方法沒有C++模板函數功能強大,java的如下代碼是無法通過編譯的:

 

 

關於Java泛型的新解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.