1. 程式人生 > 實用技巧 >第九章:泛型

第九章:泛型

一、泛型的理解

1.1、泛型的概念

  所謂泛型,就是允許在定義類、介面時通過一個標識表示類中某個屬性的型別或者是某個方法的返回值及引數型別。這個型別引數將在使用時(例如,繼承或實現這個介面,用這個型別宣告變數、建立物件時確定(即傳入實際的型別引數,也稱為型別實參)。

1.2、泛型的引入背景

  集合容器類在設計階段/宣告階段不能確定這個容器到底實際存的是什麼型別的物件,所以在JDK1.5之前只能把元素型別設計為Object,JDK1.5之後使用泛型來解決。因為這個時

候除了元素的型別不確定,其他的部分是確定的,例如關於這個元素如何儲存,如何管理等是確定的,因此此時把元素的型別設計成一個引數,這個型別引數叫做泛型。

Collection<E>,List<E>,ArrayList<E> 這個<E>就是型別引數,即泛型。

二、泛型在集合中的使用

2.1、在集合中使用泛型之前

圖示:

程式碼:

package com.zixue.java;

import org.junit.Test;

import java.util.*;

public class GenericTest {


    //在集合中使用泛型之前的情況:
    @Test
    public void test1(){
        ArrayList list = new ArrayList();
        
//需求:存放學生的成績 list.add(78); list.add(76); list.add(89); list.add(88); //問題一:型別不安全 // list.add("Tom"); for(Object score : list){ //問題二:強轉時,可能出現ClassCastException int stuScore = (Integer) score; System.out.println(stuScore); } } }

2.2、在集合中使用泛型之後

圖示:

程式碼:

package com.zixue.java;

import org.junit.Test;

import java.util.*;

public class GenericTest {
    
    //在集合中使用泛型的情況:以ArrayList為例
    @Test
    public void test2(){
        ArrayList<Integer> list =  new ArrayList<Integer>();

        list.add(78);
        list.add(87);
        list.add(99);
        list.add(65);
        //編譯時,就會進行型別檢查,保證資料的安全
//        list.add("Tom");

        //方式一:
//        for(Integer score : list){
//            //避免了強轉操作
//            int stuScore = score;
//
//            System.out.println(stuScore);
//
//        }
        //方式二:
        Iterator<Integer> iterator = list.iterator();
        while(iterator.hasNext()){
            int stuScore = iterator.next();
            System.out.println(stuScore);
        }
    }

    //在集合中使用泛型的情況:以HashMap為例
    @Test
    public void test3(){
//        Map<String,Integer> map = new HashMap<String,Integer>();
        //jdk7新特性:型別推斷
        Map<String,Integer> map = new HashMap<>();

        map.put("Tom",87);
        map.put("Jerry",87);
        map.put("Jack",67);

//        map.put(123,"ABC");
        //泛型的巢狀
        Set<Map.Entry<String,Integer>> entry = map.entrySet();
        Iterator<Map.Entry<String, Integer>> iterator = entry.iterator();

        while(iterator.hasNext()){
            Map.Entry<String, Integer> e = iterator.next();
            String key = e.getKey();
            Integer value = e.getValue();
            System.out.println(key + "----" + value);
        }
    }
}

2.3、總結

  ① 集合介面或集合類在jdk5.0時都修改為帶泛型的結構。

  ② 在例項化集合類時,可以指明具體的泛型型別

  ③ 指明完以後,在集合類或介面中凡是定義類或介面時,內部結構(比如:方法、構造器、屬性等)使用到類的泛型的位置,都指定為例項化的泛型型別。比如:add(E e) --->例項化以後:add(Integer e)

  ④ 注意點:泛型的型別必須是類,不能是基本資料型別。需要用到基本資料型別的位置,拿包裝類替換

  ⑤ 如果例項化時,沒有指明泛型的型別。預設型別為java.lang.Object型別。