集合框架-引入泛型

ZHOU_VIP發表於2017-04-23

2:泛型(掌握)

(1)泛型概述

    是一種把明確型別的工作推遲到建立物件或者呼叫方法的時候才去明確的特殊的型別。

(2)格式:

    <資料型別>

    注意:該資料型別只能是引用型別。

(3)好處:

    A:把執行時期的問題提前到了編譯期間

    B:避免了強制型別轉換

    C:優化了程式設計,解決了黃色警告線問題,讓程式更安全

(4)泛型的前世今生

    A:泛型的由來

        Object型別作為任意型別的時候,在向下轉型的時候,會隱含一個轉型問題

    B:泛型類  

        把泛型定義在類上

        格式:public class 類名<泛型類1,...>

        注意:泛型型別必須是引用型別

    C:泛型方法

        把泛型定義在方法上

        格式:public <泛型型別> 返回型別 方法名(泛型型別...)

    D:泛型介面

        把泛型定義在介面上

        格式:public interface 介面名<泛型型別1...>

    E:泛型高階萬用字元

        ?

        ? extends E

        ? super    E


package cn.itcast_01;

import java.util.ArrayList;
import java.util.Iterator;

/*
 * ArrayList儲存字串並遍歷
 * 
 * 我們按照正常的寫法來寫這個程式, 結果卻出錯了。
 * 為什麼呢?
 *         因為我們開始儲存的時候,儲存了String和Integer兩種型別的資料。
 *         而在遍歷的時候,我們把它們都當作String型別處理的,做了轉換,所以就報錯了。
 * 但是呢,它在編譯期間卻沒有告訴我們。
 * 所以,我就覺得這個設計的不好。
 * 回想一下,我們的陣列
 *         String[] strArray = new String[3];
 *         strArray[0] = "hello";
 *         strArray[1] = "world";
 *         strArray[2] = 10;
 * 集合也模仿著陣列的這種做法,在建立物件的時候明確元素的資料型別。這樣就不會在有問題了。
 * 而這種技術被稱為:泛型。
 * 
 * 泛型:是一種把型別明確的工作推遲到建立物件或者呼叫方法的時候才去明確的特殊的型別。引數化型別,把型別當作引數一樣的傳遞。
 * 格式:
 *         <資料型別>
 *         此處的資料型別只能是引用型別。
 * 好處:
 *         A:把執行時期的問題提前到了編譯期間
 *         B:避免了強制型別轉換
 *         C:優化了程式設計,解決了黃色警告線
 */
public class GenericDemo {
    public static void main(String[] args) {
        // 建立
        ArrayList<String> array = new ArrayList<String>();

        // 新增元素
        array.add("hello");
        array.add("world");
        array.add("java");
        // array.add(new Integer(100));
        //array.add(10); // JDK5以後的自動裝箱
        // 等價於:array.add(Integer.valueOf(10));

        // 遍歷
        Iterator<String> it = array.iterator();
        while (it.hasNext()) {
              // ClassCastException
              // String s = (String) it.next();

              //加了泛型後不需要強制型別轉換了
              String s = it.next();
              System.out.println(s);
        }

        // 看下面這個程式碼
        // String[] strArray = new String[3];
        // strArray[0] = "hello";
        // strArray[1] = "world";
        // strArray[2] = 10;
    }
}


相關文章