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

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

                                                     Java基礎增強------泛型

              http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流!

一、概述:

泛型是提供給javac編譯器使用的,可以限定集合中的輸入型別,讓編譯器擋住源程式中的非法輸入,編譯器編譯帶型別說明的集合時會去除掉“型別“資訊,使源程式遠行效率不受影響,對於引數化的泛型型別,getClass()方法的返回值和原始型別完全一樣,由編譯器生成的位元組碼會去掉泛型的型別資訊,只要能跳過編譯器,就可以往某個泛型集合中加入其他型別的資料資訊,只要能跳過編譯器,就可以往某個泛型集合中加入其他型別的資料,例如,用反射得到集合,在呼叫其add()方法即可。

二、功能:

2.1泛型是在JDK1.5版本出現的新特性,用於解決安全問題,是一個安全機制。

2.2將執行時期出現的問題ClassCastException,轉移到了編譯時期,方便程式設計師解決問題,讓執行事情問題減少,安全。

2.3避免了強制型別轉換麻煩。

注:在JDK1.5中還是可以不使用泛型,只是編譯器提示報告unchecked警告。

三、泛型的特點:

  3.1 型別安全

      泛型的主要目標是提高Java程式的型別安全。通過使用泛型定義的變數的型別限制,編譯器可以再編譯時檢驗型別合法性。如果沒有泛型,那麼型別的安全性主要由編譯者來把握,這顯得不如帶有泛型的程式安全性高。

   3.2 效能改善

       泛型的另外一個附帶優點,就是能消除原始碼中的許多強制型別轉換。這使得程式碼可讀性好,並減少了出錯的機會。

   3.3 效能改善

      泛型為較大的優化帶來可能。在泛型的初始實現中,編譯器將強制型別轉換插入生成的位元組碼中。但是更多的型別資訊可用於編譯器這一事實,為未來版本的JVM的優化帶來改進。

    3.4擦出

  泛型的實現方式採用了“擦出”方式。Java語言中的泛型基本上完全在編譯器中實現,編譯器生成的程式碼與手工編寫的不用泛型程式的型別,但進行強制型別轉換所得到的程式碼基本相同,泛型只是更能確保型別安全。

四、泛型中常用的術語

ArrayList<E>型別定義和Arraylist<Integer>類引用及如下術語:

整個稱為Arraylist<E>泛型

Arraylist<E>中的E稱為類變數或型別引數

整個Arraylist<Integer>稱為引數化的型別

Arraylist<Integer>中的Integer稱為型別引數的例項或實際型別引數 

Arraylist<Integer>中的<>念著Typeof

Arraylist稱為原始型別

引數化型別與原始型別的相容性:

<span style="font-size:14px;">引數化型別可以引用一個原始型別的物件,編譯報告警告,例如,

Collection<String> c = new Vector();

原始型別可以引用一個引數化型別的物件:編譯報告警告,例如,

Collection c = new Vector<String>();

引數化型別不考慮型別引數的繼承關係:

Vector<String> v = new Vector<Object>();錯誤
</span>


泛型中的型別引數嚴格說明集合中裝載的資料型別是什麼和可以加入什麼型別的資料,記住Collection<String>與Collection<Object>是兩個沒有轉換關係的引數化型別。

 以下案例外,演示泛型在應用中的簡單對比。突出泛型功能的優點。

<span style="font-size:14px;">package ClassDemo;

import java.util.ArrayList;

public class TTestDemo {

/**

 * @param args

 * 類的功能為說明泛型在類中的應用案例

 */

public static void main(String[] args) {

ArrayList aList = new ArrayList();

aList.add(1);

aList.add(2L);

aList.add("str");

int  i = (Integer) aList.get(3);//編譯時需要強制型別轉換

ArrayList<String>  aList  =  new ArrayList<String>();

aList.add("a");

aList.add("b");

aList.add("c");

String str = aList.get(3);//在取元素時不需要進行強制型別轉換

}

}
</span>

證:

源程式遠行效率不受影響,對於引數化的泛型型別,getClass()方法的返回值和原始型別完全一樣?

<span style="font-size:14px;">       //定義兩個ArrayList儲存不同的資料型別。

ArrayList<Integer>  aList1 = new ArrayList<Integer>();

ArrayList<String>  aList  =  new ArrayList<String>();

//獲取Arraylist的位元組碼比較位元組碼是否相等。

System.out.println(aList.getClass() == aList1.getClass());

 

通過反射機制向集合中新增不同型別的資料。

//通過反射機制向集合中新增不同的元素

ArrayList<String>  arrayList  = new ArrayList<String>();


Method addMethod = arrayList.getClass().getMethod("add",Object.class);

addMethod.invoke(arrayList, 50);


Iterator iterator = arrayList.iterator();

while(iterator.hasNext()){

System.out.println(iterator.next());

}
</span>

相關推薦

黑馬程式設計師——

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