1. 程式人生 > >java內功系列六(泛型、異常、註解)

java內功系列六(泛型、異常、註解)

泛型:

1.泛型的出現主要解決了容器中元素放進去後直接變成了object型別。在編譯的時候如果傳入錯誤的元素將會出錯。
2.每次傳給泛型類、介面的型別引數不一樣相當於建立了一個新的類。list<string>和list以及list<int>是不一樣的型別。(邏輯上存在物理上不存),list<string>和list<int>在物理上對應的檔案還是list類檔案,所以list<string>.clas和list<int>.class是相等的。
3.由於泛型共享一個物理檔案,所以針對類級別的操作不能有泛型出現,如不能有泛型靜態變數,泛型靜態方法中的泛型引數(靜態方法本身可以是泛型方法,它不適用類的泛型形參)。同理instanceof方法後面也不能有泛型。
4.如果foo是bar的子類,那麼foo[]依然是bar[]的子型別,但是G<foo>不是G<bar>的子類,更不相等。
5.萬用字元泛型的集合不能給集合新增元素(java不允許把一個物件放進未知型別集合)。list<?> ls;ls.add("xx");這種是錯誤的。萬用字元泛型集合可以設定上限(list<? extends shap>)和下限(list<? super shap>)
6.型別形參也可設定上限(list<T extends person & java.io.Serializable> 表示T必須實現person並且實現Serializable介面)和下限(list<T super person> 表示T必須是person父類)
7.泛型方法格式(呼叫的時候不用像類一樣指定引數型別,系統會自動判斷)
修飾符 <T,S> 返回型別 方法名(形參列表){}
8.泛型類被繼承時定義子類時必須確定泛型的具體型別,或者子類提供泛型,父類繼續用子類的泛型。
9.使用萬用字元還是泛型方法(目前沒有太明白):目前一點是泛型方法主要設計的型別形參表示方法一個或者多個引數之間有型別依賴關係,或者返回值與引數之間有依賴關係,否則用萬用字元。(參考瘋狂java 9.4.2節)
10.擦除和轉換:把一個帶有泛型的類轉換為非泛型的類將失去泛型功能,基本物件也會變為object。如:list<string> l;list m=l;m失去string資訊


 

異常:

1.異常主要依賴try、catch、finally、throw、throws關鍵字構成。
2.如果在try、catch使用exit等方法將應用程式關閉,那麼finally塊將不會執行,不要在finally塊中使用return、throw語句,這樣導致try、catch中的return和throw語句失效。當系統執行到try、catch塊中發現有return或throw,程式不會立即執行它而是看是否有finally塊,執行完finally後再回過頭執行return或throw。但是如果finally中已經有return或throw那麼它直接執行finally中的,try和catch中的就不會再執行了。(因此建議不要在finally中寫return和throw)
3.針對異常可以先在方法內部做預先處理,然後繼續把異常封裝後或者不封裝直接拋給呼叫者處理(catch和throw的結合)

 

註解:

1.自定義annotation:
public @interface test{}
2.可以給不同元素附件不同的元資料後再執行的時候做特殊處理,如自動化測試,新增事件處理方法。定義了annotation後還需要工具對這些annotation進行後期處理(繫結特別的功能等)