好程式設計師Java教程分享Java難點解析之泛型
好程式設計師Java 教程分享 Java難點解析之泛型, 只要帶有<> 的類或者介面,都屬於帶有型別引數的類或者介面,在使用這些類或者介面時,必須給 <> 中傳遞一個具體的引用資料型別。
泛型技術:其實應用在編譯時期,是給編譯器使用的技術,到了執行時期,泛型就不存在了。
為什麼? 因為泛型的擦除:也就是說,編輯器檢查了泛型的型別正確後,在生成的類檔案中是沒有泛型的。
在執行時,如何知道獲取的元素型別而不用強轉呢?
泛型的補償:因為儲存的時候,型別已經確定了是同一個型別的元素,所以在執行時,只要獲取到該元素的型別,在內部進行一次轉換即可,所以使用者不用再做轉換動作了。
什麼時候用泛型類呢?
當類中的操作的引用資料型別不確定的時候,以前用的Object 來進行擴充套件的,現在可以用泛型來表示。這樣可以避免強轉的麻煩,而且將執行問題轉移到的編譯時期。
泛型在程式定義上的體現:
// 泛型類:將泛型定義在類上。
classTool<Q>{
privateQobj;
publicvoidsetObject(Qobj){
this.obj=obj;
}
publicQgetObject(){
returnobj;
}
}
// 當方法操作的引用資料型別不確定的時候,可以將泛型定義在方法上。
public<W>voidmethod(Ww){
System.out.println("method:"+w);
}
// 靜態方法上的泛型:靜態方法無法訪問類上定義的泛型。如果靜態方法操作的引用資料型別不確定的時候,必須要將泛型定義在方法上。
publicstatic<Q>voidfunction(Qt){
System.out.println("function:"+t);
}
// 泛型介面 .
interfaceInter<T>{
voidshow(Tt);
}
classInterImpl<R>implementsInter<R>{
publicvoidshow(Rr){
System.out.println("show:"+r);
}
}
------------------------------------------------------------
泛型中的萬用字元:可以解決當具體型別不確定的時候,這個萬用字元就是? ;當操作型別時,不需要使用型別的具體功能時,只使用 Object 類中的功能。那麼可以用 ? 萬用字元來表未知型別。
泛型限定:
上限:?extendsE :可以接收 E 型別或者 E 的子型別物件。
下限:?superE :可以接收 E 型別或者 E 的父型別物件。
上限什麼時候用:往集合中新增元素時,既可以新增E 型別物件,又可以新增 E 的子型別物件。為什麼?因為取的時候, E 型別既可以接收 E 類物件,又可以接收 E 的子型別物件。
下限什麼時候用:當從集合中獲取元素進行操作的時候,可以用當前元素的型別接收,也可以用當前元素的父型別接收。
泛型的細節:
1 )、泛型到底代表什麼型別取決於呼叫者傳入的型別,如果沒傳,預設是 Object 型別;
2 )、使用帶泛型的類建立物件時,等式兩邊指定的泛型必須一致;
原因:編譯器檢查物件呼叫方法時只看變數,然而程式執行期間呼叫方法時就要考慮物件具體型別了;
3 )、等式兩邊可以在任意一邊使用泛型,在另一邊不使用 ( 考慮向後相容 ) ;
ArrayList<String>al=newArrayList<Object>();// 錯
// 要保證左右兩邊的泛型具體型別一致就可以了,這樣不容易出錯。
ArrayList<?extendsObject>al=newArrayList<String>();
al.add("aa");// 錯
// 因為集合具體物件中既可儲存 String ,也可以儲存 Object 的其他子類,所以新增具體的型別物件不合適,型別檢查會出現安全問題。? extendsObject 代表 Object 的子型別不確定,怎麼能新增具體型別的物件呢?
publicstaticvoidmethod(ArrayList<?extendsObject>al){
al.add("abc");// 錯
// 只能對 al 集合中的元素呼叫 Object 類中的方法,具體子型別的方法都不能用,因為子型別不確定。
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2662247/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 好程式設計師Java教程分享Java之設計模式程式設計師Java設計模式
- 好程式設計師Java教程分享Java面試題之Hibernate程式設計師Java面試題
- 好程式設計師Java教程分享Java語法程式設計師Java
- 好程式設計師Java教程分享Java的五大特點程式設計師Java
- 好程式設計師Java教程分享Java面試常見技術難題程式設計師Java面試
- 好程式設計師Java教程分享Java面試妙招程式設計師Java面試
- 好程式設計師Java教程分享Java開發工具程式設計師Java
- 好程式設計師Java教程分享List介面程式設計師Java
- 好程式設計師Java教程分享javaweb框架程式設計師JavaWeb框架
- 好程式設計師Java教程分享Vue外掛之Axios程式設計師JavaVueiOS
- 好程式設計師Java教程分享Java技術知識點總結程式設計師Java
- 好程式設計師Java教程分享Java之包裝類與常用類程式設計師Java
- 好程式設計師Java教程分享Java開發主流框架程式設計師Java框架
- 好程式設計師Java教程分享Java 迴圈結構程式設計師Java
- 好程式設計師Java教程分享Java8.0新特性之Lambda表示式程式設計師Java
- 好程式設計師Java教程分享Java中String型別的10個問題程式設計師Java型別
- 好程式設計師Java教程分享Java中this的幾種用法程式設計師Java
- 好程式設計師Java教程分享幾個流行的Java框架程式設計師Java框架
- 好程式設計師Java學習路線分享java為什麼不支援泛型陣列程式設計師Java泛型陣列
- 好程式設計師Java教程分享詳細瞭解Javasax解析器程式設計師Java
- 好程式設計師Java教程分享:Java工程師常見面試題程式設計師Java工程師面試題
- 好程式設計師Java教程分享Jmeter效能測試程式設計師JavaJMeter
- 好程式設計師Java教程分享MyBatis Plus介紹程式設計師JavaMyBatis
- 好程式設計師Java培訓分享Java物件導向概念解析程式設計師Java物件
- 好程式設計師Java實用教程系列之物件的轉型程式設計師Java物件
- 好程式設計師Java教程分享Java物件導向與程式導向程式設計師Java物件
- 好程式設計師Java培訓分享Java程式設計技巧程式設計師Java
- 好程式設計師Java培訓分享Java之反射技術程式設計師Java反射
- 好程式設計師Java教程分享Java的4大核心基礎程式設計師Java
- 好程式設計師Java教程分享如何系統的學習Java程式設計師Java
- java 泛型程式設計Java泛型程式設計
- 好程式設計師Java培訓之泛型繼承原理與用法詳解程式設計師Java泛型繼承
- 好程式設計師分享java設計模式之享元模式程式設計師Java設計模式
- 好程式設計師Java教程分享Java設計模式的6大原則程式設計師Java設計模式
- 好程式設計師Java分享SpringMVC之@ResponseBody註解程式設計師JavaSpringMVC
- 好程式設計師Java培訓分享零基礎學Java能行嗎 有哪些難點程式設計師Java
- 好程式設計師Java培訓分享Java程式設計師技能提升指南程式設計師Java
- 好程式設計師Java教程分享MySQL目錄結構程式設計師JavaMySql