泛型的概念: 簡單地講,就是同一個方法(類),可以接受不同的數據類型並運行得到相對應的結果,不會出現安全問題 上一篇有一段這樣的代碼: 沒有定義集合類型、迭代器類型 這裡會有隱患:如果add(1);,自動裝箱成Integer類型,無法轉換成String,發生類型的轉換異常 java中提出了泛型的概念 ...
泛型的概念:
簡單地講,就是同一個方法(類),可以接受不同的數據類型並運行得到相對應的結果,不會出現安全問題
上一篇有一段這樣的代碼:
沒有定義集合類型、迭代器類型
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()); } } }