1. 程式人生 > >java泛型類

java泛型類

一、泛型概念簡述
泛型嗎,就是泛泛的型別,指代某一種型別的符號。
這樣有啥好處呢?1.消除強制型別轉換;2.附加型別檢查,避免錯誤型別;3.確保Java型別安全(這才是主要目的)等。相信用過集合框架的都有類似體會。

二、泛型基礎特徵
1)在定義泛型類或宣告泛型類的變數時,使用尖括號來指定形式型別引數。例如java.util.Map介面的定義:
public interface Map<K, V> {

               public void put(K key, V value);

               public V get(K key);

     }

命名方式約定以大寫的單個字母名稱作為型別引數。
2)泛型不是協變的,即無法向上轉型。不同於Object obj = new String(“str”),以下方式是錯誤的:

          錯誤程式碼   即無法向上轉型
          List<int> intsList = new ArrayList<int>();
          List<Object> objList = intsList; 

如果第二行寫成List objList = strList,可以通過編譯但會出現警告(型別不安全)。那如何表示泛型為一個通用泛型,就是定義個尖括號內可以放任意型別的泛型呢?這是就要使用型別萬用字元了。
3)型別萬用字元,’?’表示。可以宣告一個List<?>,作為任何泛型List的父型別。即List<?> objList = strList,這樣就沒啥問題了。
4)受限泛型,即給泛型定義上下限。簡單說,就是型別引數必須是某類及其子類(上限),或者是某類及其父類(下限)。
怎麼弄捏,例如List為傳入引數,限定型別引數必須為Number,如下:

 public void fun(List<? extends Number> list) {…}

上述List只接收Number及Number的子類。另一種方式,只接收Integer及其父類,則如下:

   public void fun(List<? super Integer> list) {…}

1.增強for迴圈
LinkedList類:

        LinkedList<String> linkedList = new LinkedList();
        linkedList.add("漢語");
        linkedList.add("英語");
        for(Iterator<String> iterator = linkedList.iterator();iterator.hasNext();){
            System.out.println(iterator.next());
        }

ArrayList類:

        ArrayList<String> strings = new ArrayList<>();
        strings.add("漢語");
        strings.add("英語");
        for(Iterator<String> iterator = strings.iterator();iterator.hasNext();){
            String s = iterator.next();
            System.out.println(s);
        }

Vector類:
特有的迭代器方法:.elements();

        Vector<String> strings = new Vector<>();
        strings.add("漢語");
        strings.add("英語");
        for(Enumeration<String> elements = strings.elements();elements.hasMoreElements();) {
            String s = elements.nextElement();
            System.out.println(s);
        }