類型參數
在定義泛型類別或宣告泛型類別的變數時,使用尖括號來指定形式類型參數。形式類型參數與實際類型參數之間的關係類似於形式方法參數與實際方法參數之間的關係,只是類型參數表示類型,而不是表示值。
命名類型參數
建議的命名約定是使用大寫的單一字母名稱作為類型參數。這與 C++ 約定有所不同(請參閱 附錄 A:與 C++ 範本的比較),並反映了大多數泛型類別將具有少量類型參數的假定。對於常見的泛型模式,建議的名稱是:
K —— 鍵,例如映射的鍵。
V —— 值,例如 List 和 Set 的內容,或 Map 中的值。
E —— 異常類別。
T —— 泛型。
方法签名由方法名称和一个参数列表(方法的参数的顺序和类型)组成。
登入後複製
1.為什麼要用泛型
# 1.放進去的元素沒有限制,放進兩種不同的對象,可能會造成異常。
2.把物件丟進集合,集合遺失了物件的狀態訊息,集合只知道它盛裝的是Object、因此取出集合元素後通常還要強制轉換
2.什麼是泛型
## ##Java的參數化類型稱為泛型,允許程式在建立集合的時候指定集合元素的類型
3.泛型的菱形語法
#後面只需要帶一對菱形括號,不需要再帶泛型
4.建立帶有泛型宣告的自訂類,為該類別定義建構器時,建構器名稱還是原來的類別名,不要增加泛型宣告。
5.從泛型類別派生子類,繼承的時候必須為父類傳入實際的參數
#public class A extends Apple{}
#裡面所有重寫父類別的方法變成對應的類型
也可以不傳入實際的參數
public class A extends Apple{}
當成Obejct類型處理
#6.並不存在泛型類別
不管泛型的實際型別參數是什麼,他們在執行時總有相同的類別。不管泛型的類型形參傳入哪一種類型實參,(在於Java中的泛型這一概念提出的目的,導致其只是作用於程式碼編譯階段,在編譯過程中,對於正確檢驗泛型結果後,會將泛型的相關資訊擦出,也就是說,成功編譯過後的class檔案中是不包含任何泛型資訊的。 #。形參
###############################################
靜態變數是被泛型類別所有實例所共享的。對於宣告為MyClass的類,存取其中的靜態變數的方法仍然是MyClass.myStaticVar。不管是透過new MyClass還是new MyClass建立的對象,都是共用一個靜態變數。假設允許型別參數作為靜態變數的型別。所以考慮以下情況:
#
MyClass class1 = new MyClass();
MyClass class2 = new MyClass();# #class1.myStaticVar = "hello";
# class2.myStaticVar = 5;
##由於泛型系統的型別擦除(type erasure)。 myStaticVar被還原成Object類型,然後當呼叫class1.myStaticVar= "hello"; 編譯器進行強制型別轉換,即myStaticVar = (String)"hello";接著呼叫class2.myStaticVar語句時,編譯器繼續進行強制型別轉換,myStaticVar = (Integer)Integer.valueOf(5); 此時myStaticVar是String類型的,當然語句會在執行時拋出ClassCastException異常,這樣一來就存在型別安全問題。因此泛型系統不允許類別的靜態變數以類型參數作為變數類型。
#
系統中不會真正產生泛型類,因此instanceod運算子後不能使用泛型類,因為根本不存在!
7.類型萬用字元
注意的是,如果Foo是Bar的一個子類型,而G是具有泛型聲明的類別或接口,G並不是G的子類型。
假設List