在JDK1.5 之前,若是把數據存入到集合的時候,須要去判斷類型是否合法,假如定義了一個List類型的集合,先向其中加入了兩個字符串類型的值,隨後加入一個Integer類型的值。這是徹底容許的,由於此時list默認的類型爲Object類型。在以後的循環中,因爲忘記了以前在list中也加入了Integer類型的值或其餘編碼緣由,編譯是能夠的,可是運行時就會報出ClassCastException,這是嚴重的安全隱患,而在1.5以後,引入了泛型而且使用了泛型以後,這個隱患在編譯時期就被暴露出來,便於開發者去避免這種隱患,也避免了進行強制轉換。能夠把泛型理解爲是java的一種安全機制,對於使用會更方便java
泛型的定義:安全
第一種:定義在類 或者接口上邊。把尖括號放在類名後邊.訪問區域是整個類裏邊,可是,靜態方法沒法訪問這個泛型。this
注意:跟在類後邊,是用來聲明一個泛型的。其餘地方不是賦值,就是使用編碼
第二種: 定義在方法上。規則:定義在修飾符以後,返回值以前。spa
如:自定義的泛型對象
public class Holder<LOL> {繼承
LOL o;接口
public void set(LOL t) {開發
this.o = t;字符串
}
public LOL get()
{
return this.o;
}
public static <LOL> void print(LOL l)
{
System.out.println(l);
}
}
自定義的泛型,能夠理解爲一個變相的類這裏面的規則都是自定義的規則,使用起來會更方便
對於自定義泛型的幾種使用方法:
何時賦予具體的數據類型:用的時候,就要賦予數據類型 --不必定爲具體的數據類型
類的泛型:
一、在這個類建立的時候,泛型有了具體的數據類型
二、在這個類被實現的時候,必須給與這個須要泛型的類一個數據類型。
能夠爲一個具體的數據類型,也能夠是一個新的泛型,若是沒顯示的設置數據類型,則默認父類的泛型裏使用Object
方法的泛型:
是在調用的時候,有了具體的數據類型
通配符:
把泛型參數理解成方法參數,當咱們的對象類型不明確時能夠用一個通配符」?」來表示,通配符表明任意類型,至關因而一個佔位符,執行的時候回被具體的類型所替代。看一個例子,加入想實現一個可以遍歷全部類型的ArrayList的通用方法,因爲實現前並不知道到底有多少類型咱們須要打印,而使用Object又可能致使ClassCastException,此時通配符的優點便出現了
使用通配符:
泛型的限定
-------------------------上限<? extends E>,下限<? super E>
因爲泛型不支持向上轉型
使用通配符就能解決基本上的問題,通用遍歷簡單類型的集合,可是要保存的是對象呢?要遍歷的對象之間又存在繼承關係呢?很明顯通配符固然能夠,可是並非全部類型的數據咱們都想要的,咱們想只要有關係的類型(繼承關係)。
格式:
<? extends E> : E類型或者是E類型的子類: 限定類型的上限.
<?> 等價於 <? extends Object>
<? super E> : E類型,或者E類型的父類 : 限定了類型的下限
寫在泛型定義的時候
格式:<E extends Person> 泛型E只能接受Person以及Person的子類
以前的定義方式<E> 就至關於 <E extends Object>
<E extends Student> 這樣泛型E就只能接受Student以及Student的父類
這是 不使用限定的狀況下遍歷的:
由於泛型沒法自動向上轉型! ! !
這是使用泛型限定以後的效果:
對於泛型的限定來講,同時也能夠在初始化把限定條件加上
一、 類上的泛型限制
class Holder<T extends Person>
{
}
二、方法上的泛型限制:
public static <T extends Person> void print(T t)
{
}