標籤:集合類 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泛型的新解