泛型程式設計的意義:編寫的**可以被很多不同型別的物件所重用。
好處:出現編譯錯誤比類在執行時出現類的強制型別轉換異常要好得多。
程式設計師的任務:**出所用類的未來可能有的所有用途。
1、定義簡單泛型類
public class paircatch(throwable t){
block.throwas(t);
ps:一般來說,我們必須捕獲執行緒run方法中的所有受查異常,但run方法宣告為不丟擲任何受查異常,我們只是丟擲異常,並"哄騙"編譯器,讓它認為這不是乙個受查異常。
(10)注意擦除後的衝突
泛型規範原則:要想支援擦除的轉換,就需要強行限制乙個類或型別變數不能同時成為兩個介面型別的子類,而這兩個介面是同一介面的不同引數化。
class employee implements comparable;
class manager extends employee implements comparable;
ps:以上兩個定義是錯誤的,原因是有可能和產生的橋方法,產生衝突。
6、泛型型別的繼承規則
(1)永遠可以將引數化型別轉換為乙個原始型別。
如:pari可以轉換為pair,但可能會產生錯誤。
(2)泛型類可以擴充套件或實現其他的泛型類。
(3)arraylist可以轉換為list,但不能轉換為list。
7、萬用字元型別
萬用字元型別中,允許型別引數變化。
子型別限定的萬用字元:
pair是pair<? extends employee>的子型別。
? extends employee限定:可以用於getter方法,不能用於setter方法。
ps:getter返回物件回來賦給employee型別,完全可以
setter型別,不可以的理由是,不知道需要哪個子類
超型別限定的萬用字元:
void setfirst(? super manager);
? super manager getfirst();
setter方法,只能傳入manager或其子類,不能傳入父類。
getter方法,只能獲取到object物件。
一般的準則:setter方法一般用超型別限定的萬用字元,getter方法一般用子型別限定的萬用字元。
另一種應用:
public static > t min(t a);
t extends comparable使用得更徹底,工作地更好。
但有chronolocaldate是localdate的父類,chronolocaldate擴充套件了comparable介面。因此使得,localdate類也擴充套件了comparable介面。
所以,可以寫成,public static > t min(t a) 來解決問題。
ps:上述宣告,只為排除呼叫引數上的不必要的限制,若是一名庫程式設計師,一定要習慣於萬用字元,否則在**中就需要多處,新增強制型別轉換直至**可以編譯。
無限定萬用字元:
pair<?>的返回?的getter方法,只能返回object,相應的setter(?)方法,不能被呼叫。
pair<?>和pair的本質:可以用任意的object物件呼叫原始pair類的setobject方法。
用法:避免使用萬用字元型別。
setfirst(null);
public static boolean hasnulls(pair<?> p){
return p.getfirst()==null || p.getsecond()==null;
Java之泛型程式設計
1.概念 泛型就是引數化型別。泛型的好處是在編譯的時候檢查型別安全,並且所有的強制轉換都是自動和隱式的,提高 的重用率。2.案例 1 先看下面案例 不適用泛型程式設計 list li new arraylist 使用泛型程式設計如下 使用泛型的優點 大型應用時能顯著降低程式的複雜度 泛型為較大的優化...
Java之泛型程式設計
1.概念 泛型就是引數化型別。泛型的好處是在編譯的時候檢查型別安全,並且所有的強制轉換都是自動和隱式的,提高 的重用率。2.案例 1 先看下面案例 不適用泛型程式設計 新增非需要型別時發現不了錯誤。使用泛型程式設計如下 如果新增的物件型別錯誤,編譯器即可發現。指定容器要持有的物件型別,用編譯器來保證...
Java學習筆記 泛型程式設計
為了使編寫的 可以被很多不同型別的物件重用。例如,arraylist建立物件例項 arraylistfiles new arraylist string 型別引數乙個泛型類就是具有乙個或多個型別變數的類,pair類示例 public class pair public pair t first,t ...