黑馬程序員__Java中的泛型

                                                                        ---------------------- android培訓java培訓、期待與您交流! ----------------------

泛型:泛型是提供給javac編譯器使用的,可以限定集合中的輸入類型,讓編譯器擋住源程序中的非法輸入。泛型的參數不能是基本類型。


編譯器編譯帶類型說明的集合時會去除掉“類型”信息,使程序運行效率不受影響,對於參數化的泛型類型,getClass()方法的返回值和原始類型完全一樣。
由於編譯生成的字節碼會去掉泛型的類型信息,只要能跳過編譯器,就可以往某個泛型集合中加入其它類型的數據,例如,用反射得到集合,再調用其add方法即可。
Vector<String> v=new Vector<String>();
v.add("aaaaaa");
v.getClass().getMethod("add",Object.class).invole(v,7)

參數化類型與原始類型的兼容性:
參數化類型可以引用一個原始類型的對象,編譯報告警告,例如, Collection<String> c = new Vector();//可不可以,不就是編譯器一句話的事嗎?
原始類型可以引用一個參數化類型的對象,編譯報告警告,例如, Collection c = new Vector<String>();//原來的方法接受一個集合參數,新的類型也要能傳進去
思考: Vector v1 = new Vector<String>(); 
Vector<Object> v = v1;////編譯通過了。一定要分清編譯階段和運行階段。編譯器只知道v是Vector類型的,此處相當於參數化類型引用原始類型


參數化類型不考慮類型參數的繼承關係:
Vector<String> v = new Vector<Object>(); //錯誤!///不寫<Object>沒錯,寫了就是明知故犯
Vector<Object> v = new Vector<String>(); //也錯誤!

數組不能使用泛型。編譯器不允許創建泛型變量的數組。即在創建數組實例時,數組的元素不能使用參數化的類型,例如,下面語句有錯誤:
Vector<Integer> vectorList[] = new Vector<Integer>[10];//錯誤!
泛型限定:
通配符-->?
使用?通配符可以引用其他各種參數化的類型,?通配符定義的變量主要用作引用,可以調用與參數化無關的方法,不能調用與參數化有關的方法。
限定通配符的上邊界:
正確:Vector<? extends Number> x = new Vector<Integer>();
錯誤:Vector<? extends Number> x = new Vector<String>();
限定通配符的下邊界:
正確:Vector<? super Integer> x = new Vector<Number>();
錯誤:Vector<? super Integer> x = new Vector<Byte>();
提示:
限定通配符總是包括自己。?只能用作引用,不能用它去給其他變量賦值
Vector<? extends Number> y = new Vector<Integer>();
Vector<Number> x = y;
上面的代碼錯誤,原理與Vector<Object > x11 = new Vector<String>();相似,

自定義泛型方法:即在返回值前加上<T>
自定義泛型類型:在一個類中的多處要使用同一類型的泛型,就用泛型類型,即 將泛型定義在類上。

靜態也可以使用泛型,但不能使用和類相同的泛型,要獨立寫。當一個變量(類型參數)被聲明爲泛型時,只能被實例變量、方法和內部類調用,
而不能被靜態變量和靜態方法調用。因爲靜態成員是被所有參數化的類所共享的,所以靜態成員不應該有類級別的類型參數。
public static<T> void save(T t){}
                                     ---------------------- android培訓java培訓、期待與您交流!

                                ----------------------詳細請查看:http://edu.csdn.net/heima

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章