Java基礎掃盲 反射與泛型 5 泛型

2021-09-20 18:59:50 字數 1826 閱讀 6802

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泛型的限定作用只在編譯階段起作用,其目的只是為了防止程式設計師在寫 的時候放入了錯誤型別的元素,當編譯完成後,...