1. 程式人生 > >Java學習筆記29(集合框架三:泛型)

Java學習筆記29(集合框架三:泛型)

出了 oar sta package 獲取 demo 強制 lis oid

泛型的概念:

簡單地講,就是同一個方法(類),可以接受不同的數據類型並運行得到相對應的結果,不會出現安全問題

上一篇有一段這樣的代碼:

沒有定義集合類型、叠代器類型

package demo;

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

public class CollectionDemo {
    public static void main(String[] args) {
        //集合可以存儲任意類型的對象
        //集合中,不指定存儲的數據類型,也可以存儲
Collection c1 = new ArrayList(); c1.add("abc"); c1.add("def"); Iterator it1 = c1.iterator(); while(it1.hasNext()){ //it.next獲取Object類型,強制轉換 String s1 = (String)it1.next(); System.out.println(s1.length()); } } }

這裏會有隱患:如果add(1);,自動裝箱成Integer類型,無法轉換成String,發生類型的轉換異常

java中提出了泛型的概念,來解決這個問題:

package demo;

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

public class GenericDemo {
    public static void main(String[] args) {
        function();
    }
    
    public static void function(){
        Collection<String> c1 = new
ArrayList<String>(); c1.add("abc"); c1.add("def"); Iterator<String> it1 = c1.iterator(); while(it1.hasNext()){ String s1 = it1.next(); System.out.println(s1); } } }

這時候如果add(1);,在編譯的時候會無法通過,解決了安全問題

其實這裏的泛型,是偽泛型,這裏只是一個編譯的手段,如果不是String類型,編譯無法通過,否則編譯成功

而編譯後的class文件裏面不存在泛型,但是由於編譯過程中處理了類型問題,所以最後運行也是安全的

泛型的方法(了解即可,沒有實際應用價值):

package demo;

import java.util.ArrayList;

public class GenericDemo {
    public static void main(String[] args) {
        ArrayList<Integer> array = new ArrayList<Integer>();
        // ArrayList集合內有方法toArray泛型方法
        array.add(123);
        array.add(456);

        Integer[] i = new Integer[(array.size())];
        Integer[] j = array.toArray(i);
        for (Integer k : j) {
            System.out.println(k);
        }
    }
}

同樣存在泛型的接口,泛型類等,目的都是為了解決安全問題並且方便使用者,並且帶來了增強for循環

泛型的通配符?:

package demo;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;

public class GenericDemo {
    public static void main(String[] args) {
        ArrayList<String> array = new ArrayList<String>(); 
        array.add("abc");
        array.add("def");
        
        HashSet<Integer> set = new HashSet<Integer>();
        set.add(123);
        set.add(456);
        
        iterator(array);
        iterator(set);
    }
    //要求定義一個方法,可以同時叠代兩個集合
    public static void iterator(Collection<?> c){
        Iterator<?> it1 = c.iterator();
        while(it1.hasNext()){
            System.out.println(it1.next());
        }
    }
}

Java學習筆記29(集合框架三:泛型)