1. 程式人生 > >黑馬程式設計師——泛型

黑馬程式設計師——泛型

---------------------- ASP.Net+Android+IO開發S.Net培訓、期待與您交流! ----------------------

泛型

泛型是JDK1.5加入的新特性,它以引數化型別的形式在編譯期“過濾”不符合實際型別引數的資料,檢查型別安全,減少安全隱患。型別引數可以加在類,介面和方法上。

泛型的生命週期

因為泛型資訊資訊基本都是在編輯期實現的,生成位元組碼後泛型資訊就會被擦除,所以在執行期可以通過反射繞過編譯期的泛型資訊來操作引數型別的物件,這點張老師在視訊上有講過。

List list =new ArrayList<Integer>();

//此時如果在list中加入的不是Integer型別編譯器就報錯
//但我們通過反射可以繞過泛型並新增元素

list.getClass.getMethod("add",Object.class).invoke(list,"hello,Cukoo");

而且,泛型引數的實際型別不能是基本資料型別,只能是引用資料型別,還有就是陣列內的元素型別也不能是引數化型別,例如  List<String> [ ] arr=new ArrayList <String>[ ];

自定義泛型

class Operator<O>{
	void add(O obj){}
	O remove(O obj){}

//上面是定義在類級別的泛型,類中的O型別引數被實際型別引數化後只要引用了這個O
//都會是同一個型別,但是如果定義成: <O>O remove(O obj)的話就是獨立的泛型方法了

//而且靜態方法不能引用類上定義的泛型的引數型別,除非自己定義成單獨的泛型方法

public static void add_2(O obj){} //這會發生異常

public static <O>void add_2(O obj){} //正確

//O在這裡只是一個變數,只是它的實際引數是引用資料型別,換成T或者其他都一樣
}


萬用字元和範圍限定

泛型中用?這個萬用字元表示任意型別,主要用來做引用,定義的方法中如果使用了<?>就只能呼叫與引數化無關的方法,不能呼叫與引數化有關的方法,例如定義方法: List<?>  list=new ArrayList()呼叫時候就不能使用list.add()這種跟引數型別有關的方法。

張老師在視訊內有講到一個問題,就是有的物件方法會返回一個”類名<?>“的物件,這時候你要麼用一個非泛型型別的變數去引用,要麼用帶泛型的變數去引用,但是這個泛型變數的引數只能是<?>

如: Class類中的asSubclass()


將泛型型別的實際型別限定在某個介面或者父類及其子類範圍之內:

ArrayList<? extends Number> list = new ArrayList<Integer>();

將泛型型別的實際型別限定在類及其父類的範圍之內:

ArrayList<? super Integer> list = new ArrayList<Number>();

關於型別引數的型別推斷 根據呼叫泛型方法時實際傳遞的引數型別或返回值的型別來推斷,具體規則如下: 1.當某個型別變數只在整個引數列表中的所有引數和返回值中的一處被應用了,那麼根據呼叫方法時該處的實際應用型別來確定,這很容易憑著感覺推斷出來,即直接根據呼叫方法時傳遞的引數型別或返回值來決定泛型引數的型別 2.當某個型別變數在整個引數列表中的所有引數和返回值中的多處被應用了,如果呼叫方法時這多處的實際應用型別都對應同一種類型來確定,這很容易憑著感覺推斷出來 3.當某個型別變數在整個引數列表中的所有引數和返回值中的多處被應用了,如果呼叫方法時這多處的實際應用型別對應到了不同的型別,且沒有使用返回值,這時候取多個引數中的最大交集型別, 4.當某個型別變數在整個引數列表中的所有引數和返回值中的多處被應用了,如果呼叫方法時這多處的實際應用型別對應到了不同的型別, 並且使用返回值,這時候優先考慮返回值的型別 5.引數型別的型別推斷具有傳遞性,下面第一種情況推斷實際引數型別為Object,編譯沒有問題,而第二種情況則根據引數化的Vector類例項將型別變數直接確定為String型別
---------------------- ASP.Net+Android+IOS開發.Net培訓、期待與您交流! ----------------------詳細請檢視:http://edu.csdn.net

相關推薦

黑馬程式設計師——

---------------------- ASP.Net+Android+IO開發S、.Net培訓、期待與您交流! ---------------------- 泛型 泛型是JDK1.5加入的新特性,它以引數化型別的形式在編譯期“過濾”不符合實際型別引數的資料,檢查

黑馬程式設計師------

                                                     Java基礎增強------泛型               http://www.itheima.com" target="blank">Java培訓、An

黑馬程式設計師

-------android培訓、java培訓、期待與您交流! ---------- 泛型的概述: 泛型是一種特殊的型別,它把指定型別的工作推遲到客戶端程式碼宣告並例項化類或方法的使用進行。也被稱為引數化型別,可以把型別當做引數一樣傳遞過來,在傳遞過來之前我不明確,但是在

黑馬程式設計師-----,Map集合

------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! ------- 1.泛型初步 泛型:JDK1.5版本

黑馬程式設計師---

1. 泛型是提供給javac編譯器使用的,可以限定集合中的輸入型別,讓編譯器擋住程式中的非法輸入,編譯器編譯代理性說明的集合時會除掉“型別”資訊,使得程式執行行旅不受影響,對於引數化的反省型別,getClass()方法的返回值和原始型別完全一樣。由於編譯生成的位元組碼會去掉泛型的型別資訊,只要能跳過編譯器,就

黑馬程式設計師

     ------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! ------- 第一講泛型(Generic)

黑馬程式設計師——Java集合框架(二)之

培訓、java培訓、java學習型技術部落格、期待與您交流!------------               泛型 一、泛型概述 1.什麼是泛型? 泛型就是指將資料型別引數化,把以前固定的資料型別用一個代表資料型別的引數進行表示,該引數可以接受傳入的任意資料型別。可以這

黑馬程式設計師-集合和集合-學習筆記

垃圾回收: 1、CLR的一個核心功能 2、垃圾回收器,的目的:提交記憶體利用率 3、只回收託管堆中的記憶體資源,不回收其他資源(資料庫連線,檔案控制代碼,網路埠等) 4、GC.Collect();//手動垃圾回收(不建議使用) 集合介紹: 延伸(陣列特點:型別統一,長度固

黑馬程式設計師_List集合如Dictionary鍵值對集合的一些用法

List泛型集合:List<T> 泛型集合 就是為了專門處理某種型別  ArrayList對應的是 List<型別名> 在尖括號中寫什麼型別,這個集合就變成了什麼型別的集合 語法:List<資料型別>  集合名稱=new List<

黑馬程式設計師——(八)

[java] view plaincopyprint? ArrayList al1 = new ArrayList ();  al1.add("abc");  al1.add("789");  al1.add("ddd");  al1.add(3);  ListIterator it = al1.l

黑馬程式設計師——Java知識點

一、Java沒有泛型之前 1.Java集合對元素型別沒有任何限制,這樣可能引發一些問題。例如,想建立一個儲存Dob物件的集合,但程式也可以輕易地將Cat物件“扔”進去,這樣可能會引發異常。 2.集合並不能儲存物件的狀態資訊,集合只知道它存放的是Object,因此取出集合元

黑馬程式設計師--第十五天:

---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ---------------------- /*15-1 Set: 元素是無序的(存入和取出的順序不一定一致),元素不可以重複。 |--HashSe

黑馬程式設計師--java高新技術 26--javaBean,,類載入器,代理spring小框架

---------------------- ASP.Net+Android+IO開發S、.Net培訓、期待與您交流! ---------------------- /*設計模式: Singleton: 單例模式 Factorty: 工廠模式 Iterator: 迭代器模

黑馬程式設計師—java基礎加強—內省、註解、

---------------------- android培訓、java培訓、期待與您交流! -------------------- 內省:IntroSpector——》JavaBean——特殊的Java類 當Java執行時可檢查自身,Java 程式中詢問它的一個物

黑馬程式設計師:基礎加強註解和

---------------------- android培訓、java培訓、期待與您交流! ----------------------瞭解註解及Java提供的幾個基本註解:註解相當於一種標記,加了註解就等於打上了

黑馬程式設計師 java

---------------------- ASP.Net+Unity開發、.Net培訓、期待與您交流! ---------------------- 一、概念介紹: Java泛型(generics)是JDK 5中引入的一個新特性,允許在定義類和介面的時候使用型別引數

黑馬程式設計師----Java基礎之面向物件(封裝 繼承 多)(二)

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師----Java基礎之面向物件(封裝 繼承 多)

------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">java培訓</a&g

黑馬程式設計師——Java面向物件(二)之封裝、繼承、多、介面等

-----------android培訓、java培訓、java學習型技術部落格、期待與您交流!------------ 五、面向物件的特徵  面向物件主要有三大特徵: 1.特徵一 —— 封裝  1)定義:是指隱藏物件的屬性和實現細節,僅對外提供公共訪問方式。 2)好處:

黑馬程式設計師——OC語言基礎——面向物件三大特性之多

繼前兩篇博文梳理了一下我對OC中面向物件三大特性的封裝、繼承之後。最重要也是最不容易理解的多型概念終於到來。 個人認為多型在三大特性中是最為重要的,但是由於它的概念性不容易用語言描述清楚,所以我還是想引用視訊教程中老師說的那句經典。 多型的實質就是: 父類的指標 指向了