author:趙志幹
date:2019-05-04
declaration:all right reserved!!!
1、什麼是泛型
所謂的泛型就是編寫模板**來適應任意型別,從而避免一些繁瑣的型別轉化,且能夠讓編譯器在編譯階段進行型別檢查。在使用泛型時,其繼承關係中要保持泛型引數不變。例如:arraylist和list有繼承關係,而arraylist和list沒有繼承關係。
在使用泛型時,需要將泛型引數t替換為需要的引用型別;當不指定泛型引數型別時,編譯器會給出警告,且只能將泛型引數視為object型別。
2、編寫泛型
按照某種型別去編寫類;
標記其中所有的特定型別;
將特定型別替換為t,並在宣告處使用;
注意:泛型型別不能用於靜態方法,否則會出現編譯錯誤,因為編譯器無法在靜態欄位或靜態方法中使用泛型型別。靜態方法可以單獨改寫為泛型方法,其使用的泛型引數和類的泛型引數不是同乙個,例如使用另乙個型別
public class pair
public t getfirst()
public t getsecond()
public static paircreate(k first,k second)
}
注意:定義泛型時,也可以使用多個泛型引數,如
3、泛型擦除
編譯器會將型別視為object,只不過在編譯的過程中會依據泛型引數實現安全的強制型別轉換。故泛型這一該概念在虛擬機器中是不存在的。由於編譯器會將泛型引數視為object,所以泛型引數不能是基本型別。
由於編譯後,編譯器會將泛型擦除,所以在執行時,無法取得帶泛型的class例項。因為他們對應的都是泛型引數為object型別時的class例項。
由於泛型引數會被擦除為object,所以t型別不可以直接例項化。其在原始碼中進行例項化時必須借助於class。如:
public class pair
}
4、extends萬用字元
由於泛型引數在繼承體系中不可變,即相同的泛型引數才具有繼承關係。為了解決這一問題,引入了extends萬用字元,其使得泛型引數由單一型別擴充套件至該單一型別及其子型別。方法引數使用萬用字元下:
public class pair
public class pairhelper
}
型別定義使用extends萬用字元如下,其限定了定義pair時只能時使用number或number的子類替換泛型引數:
public class pair
public t getfirst()
public t getsecond()
}
5、super萬用字元
super萬用字元是extends萬用字元的互補,其在方法引數中使用時,表明泛型引數由單一型別擴充套件至單一型別及其超類。
public class pair
public class pairhelper
}
同理,super萬用字元用於型別定義時,其限定了泛型引數只能使用指定單一型別及其超類。
注意:<? extends t> 允許呼叫方法獲取t的引用,而<? super t>允許呼叫方法傳入t的引用。
6、無限定萬用字元
<?>稱為無限定萬用字元,包含了super萬用字元和extends萬用字元的限制,所以無限定萬用字元很少使用。
泛型與反射
泛型 泛型的作用 泛型是jdk1.5以後才有的,可以在編譯時期進行型別檢查,且可以避免頻繁型別轉化!泛型的使用 泛型的方法 public class genericdemo 測試方法 test public void testmethod throws exception 泛型的類 public c...
java泛型反射總結
在需求中,資料庫有兩張表user,admin。我們要查詢裡面的id,name等資訊通常都是寫兩個dao,然後分別給每個查詢欄位寫一套方法。然而其實查詢這些欄位的方法都大同小異,所以產生了乙個更好的解決辦法,就是寫乙個通用的dao,然後把相同的方法寫在通用的dao genericdao 裡,然後然實體...
java反射 列舉 泛型
1.呼叫反射的三種方法 2.class.forname 動態編譯 3.反射獲得方法 構造方法 成員變數 4.反射獲得mehtod再用invoke呼叫方法 5.反射是編譯之後的 注意 list泛型的限定作用只在編譯階段起作用,其目的只是為了防止程式設計師在寫 的時候放入了錯誤型別的元素,當編譯完成後,...