泛型,java泛型

來源:互聯網
上載者:User

泛型,java泛型
1.    概念解析

  首先要知道這裡的泛型是針對參數類型而言的,從字面上理解:“泛”字很好理解,體現的當然是“泛化”也就是“抽象”思想,在某種程度上擴充了參數類型的範圍。“型”字又可(狹隘的)理解為強型別支援,即參數類型必須屬於某種類型;而且對此種類型又可能做一定的限制,也就是所謂的“泛型參數約束”。“強型別支援”與“泛型參數約束”都在某種程度上限制了參數類型的範圍,體現了“細化”的思想。


2.    泛型的作用

  上面說了“泛”體現了抽象的思想,也就是將參數類型進行高層次抽象,從而使參數類型由依賴於具體轉到了依賴於抽象,這樣就使得代碼可以複用,程式更加靈活。而“型”字,理解為強型別支援+泛型參數約束,也就是規定了參數類型必須是某種類型,而且可能對此類型還另附加一定的約束條件。“強型別支援”避免了隱式的裝箱、拆箱,從而提高了程式的效能;強型別支援+泛型參數約束決定了在編譯時間就可找到不符合參數類型要求的地方,這樣就保證了編譯時間的型別安全,從而避免了運行時的類型轉換錯誤。總結一下就是,“泛”是為了代碼可以複用,程式更加靈活;“型”是為了提高程式的效能與安全。


3.    什麼時候需要用泛型?該怎麼用?

  上面提到了,泛型的作用主要有兩個:【作用一】通過抽象參數類型,從而代碼可以複用,程式更加靈活;【作用二】通過強型別支援與泛型參數約束,從而提高程式的效能與安全。那麼這樣就很明白什麼時候需要用泛型了:


3.1 當參數類型不固定,易變化,想使得程式可以靈活應對時,泛型的【作用一】或可解決,例如:
  

  如所示為,冒泡排序演算法在“不使用泛型”與“使用泛型”兩種情況下的寫法。前者只能對int數群組類型進行排序;後者是對只要繼承了IComparable介面的類型(例如char、int,所示)對應的數組都可以進行排序。

  黃色高亮處為從不使用泛型到使用泛型所更改的地方,可以看到總共有4處修改:

  Ø  首先,方法名後面加了<T>,代表參數單元必須為T類型,即所謂的“強型別支援”。

  Ø  然後,參數類型由確定的int[]變為了不確定的T[],即所謂的“參數類型抽象”。

  Ø  然後,方法後面加了whereT:IComparable,代表T類型必須實現IComparable介面,即所謂的“泛型參數約束”。

  Ø  然後,比較方法由”<”變為了CompareTo(object)方法,此方法存在於IComparable介面中,正是char、int等類型中提取的共同的特徵,因為它們都實現了這個介面。

  如:int、char類型都實現了IComparable介面:


  

  


  執行個體總結:未使用泛型的演算法之所以不能適用多種類型,根本原因是該演算法使用了某一種類型所特有的東西,即:array[j]<array[j-1]中的“<”號。所以想要適用多種類型,只需找到這多種類型的對象都適用的比較方法即可,恰好C#中有通用的比較方法,即:CompareTo(object),而此方法位於IComparable介面中,所以只要實現了此介面就可享用它的CompareTo(object)方法。於是我們對這多種類型進行了抽象得出類型T(不確定類型),再讓T實現IComparable介面,不就相當於多種類型都實現了該介面嗎,都實現了該介面不就都可以享用介面的CompareTo(object)方法了嗎,這個問題不就解決了嗎。

  該執行個體解決問題的思路是找變化點,找相同點;然後想法用相同點替換變化點。主要手段是“抽象參數類型”,當然也並帶了“強型別支援”與“泛型參數約束”。


3.2 當想提高程式效能與安全性時,泛型的【作用二】或可解決

  因為“強型別支援”避免了隱式的裝箱、拆箱,從而提高了程式的效能;如下執行個體:

  

  強型別支援+泛型參數約束決定了在編譯時間就可找到不符合參數類型要求的地方,這樣就保證了編譯時間的型別安全,從而避免了運行時的類型轉換錯誤。如下執行個體:

  


 

4.    泛型類與泛型方法

  兩者只是在聲明強制類型支援與泛型參數約束的位置不同,一個在類後,一個在方法後。唯一的區別僅僅是範圍不同。例:

  


5.    泛型與集合

  泛型之所以與集合經常一起用,是因為集合包含的往往是多個甚至是很多個對象,一旦涉及到陰式地裝箱、拆箱操作,整個集合中所有對象都要走這個過程,這將很大的降低程式的效能。反之,如果運用泛型,將會避免陰式的拆裝箱,當然也就大大提高了程式效能。當然也能起到保證編譯時間的型別安全,避免運行時的類型轉換錯誤的作用。

       所以集合操作主要是應用了泛型【作用二】中的“強型別支援”。


6.    總結

  主要從字面和運用執行個體介紹了泛型的作用:

  Ø  通過抽象參數類型,使得代碼可以複用,程式更加靈活

  Ø  通過參數的“強型別支援”避免了隱式的裝箱、拆箱,從而提高了程式的效能

  Ø  通過強型別支援+泛型參數約束,決定了在編譯時間就可找到不符合參數類型要求的地方,從而保證了編譯時間的型別安全,避免了運行時的類型轉換錯誤


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.