Writer:BYSocket(泥沙磚瓦漿木匠)java
微博:BYSocketweb
豆瓣:BYSocket算法
ArrayList是集合類中無處不在的,泛型也是,泛型對集合類尤爲有用。可是爲啥要使用泛型?理解好了這個問題能夠幫助理解相關的更多知識點。下面泥瓦匠以最簡單的例子來驗證這個問題。安全
泛型的目的是爲了可讓更多不一樣類型的對象重用。沒錯,這樣理解就太low。真正目的是爲了在編譯時找到bug,而不是在運行時。(編譯時,指的是源代碼翻譯成機器識別的代碼的時候。運行時,是指代碼在機器中運行的時候。)泛型只存在編譯時,理解這個能夠幫助你更好的理解泛型。socket
這樣,在編譯時會比在運行時更容易地找到bug和修復。this
簡易版的ArrList有個Obejct對象(由於是Object,咱們能夠add任意類型。)好比說,Integer 和 String的。代碼以下:spa
/** * 簡易版ArrayList */ class ArrList { private Object obj; public Object getObj() { return obj; } public void add(Object obj) { this.obj = obj; } } public class TestArrayList { public static void main(String[] args) { ArrList arrList = new ArrList(); arrList.add(1); arrList.add("1"); Integer objInt = (Integer) arrList.getObj(); System.out.println(objInt); } }
運行能夠看出會出現ClassCastException:翻譯
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer at javaBasic.generic.TestArrayList.main(TestArrayList.java:30)
想問的問題是:」這Object對象屬性,怎麼不能強轉呢?「code
答:編譯時,代碼沒錯的。運行main時,當set了String類型時,將結果強制轉換爲Integer就會報錯這個錯了。orm
泥瓦匠的記憶宮殿又來了:
一、使用泛型比那些雜亂的須要強制轉換的Object代碼具備更好的安全性和可讀性。
二、使用泛型能夠在編譯時輕鬆找到和解決bugs
使用泛型代碼以下:
package javaBasic.generic; /** * 簡易版ArrayList */ class ArrList<T> { private T obj; public T getObj() { return obj; } public void add(T obj) { this.obj = obj; } } public class TestArrayList { public static void main(String[] args) { ArrList<Integer> arrList = new ArrList<>(); arrList.add(1); // arrList.add("1"); Integer objInt = arrList.getObj(); System.out.println(objInt); } }
這時候若是想用
arrList.add("1");
會發現:
這時候就是泛型大顯身手的時候,也不用須要對屬性 get 方法時的強制轉換。其實, Java 泛型只是編譯時的概念,由於編譯後類型會被擦除,還本來真。這裏T就至關於Integer。
4、小結
泥瓦匠記憶宮殿:
一、在編譯時檢查強類型
二、顯示轉換的消除(上面的Integer get省去)
三、更好地實現代碼重用和泛型算法
四、使用泛型比那些雜亂的須要強制轉換的Object代碼具備更好的安全性和可讀性。
Java 泛型只是編譯時的概念,由於編譯後類型會被擦除,還本來真。哈哈~下次說這個。
Writer:BYSocket(泥沙磚瓦漿木匠)
微博:BYSocket
豆瓣:BYSocket