第9章 泛型

9.1.2 使用泛型

java1.5以後引入了參數類型,允許程序在創建聚合時,指定集合元素的類型,java的參數化類型被稱爲泛型

9.1.3泛型的“菱形”語法

java 7 後面菱形中的類型可以省略。

 

9.2 深入泛型

所謂泛型,就是允許定義類。接口、方法時使用類型形參,這個類型形參將在聲明變量、創建對象、調用方法時動態的指定

當創建帶泛型的聲明的類時,爲該類定義構造器時,構造器的名還是遠啦的名,不要增加泛型聲明

包含泛型聲明的類型可以在定義變量,創建對象時傳入一個類型聲明,從而可以動態的生成無數個邏輯上的子類,但種子類物理上並不存在

9.2.2 從泛型類派生子類

當創建了帶泛型的聲明的接口,父類之後,可以爲該接口創建實現類或從該父類派生子類,當使用這些接口,父類時不能再包含類型形參

定義方法時可以聲明形參,調用方法時必須爲這些數據形參傳入實際的數據,與此類似的是,定義類 接口 方法時都可以聲明類型參數,但是使用類接口方法時必須爲形參傳入實際的類型

9.2.3 並不存在泛型類

靜態方法,靜態初始化塊或者靜態變量的聲明和初始化中不允許使用類型參數

由於系統不會生成泛型類,所有instanceof運算符後不能使用泛型類

 

如果Foo Bar的子類型(子接口,子類)而G是具有泛型聲明的類或者接口,那麼G<Foo>並不是G<Bar>的子類

如果Foo Bar的子類型(子接口,子類)那麼Foo[]依然是Bar[]的子類型

 

java泛型設計的原則是 只要在編譯時沒有出現警告,運行時就不會出現造型異常

9.3.1使用類型通配符

爲了表示各種泛型List的父類,可以使用類型通配符,類型通配符是一個問號(?),將一個問號作爲類型實參參數List集合,寫作List<?>,它的元素類型可以匹配任何類型

 

但是這種帶通配符的List,僅表示它是各種泛型List的父類,並不能把元素加入到其中。

 

9.3.2 設置類型通配符的上限

List<? extends Shape> 是受限通配符的例子,此處的問號(?)代表一個未知的類型,此處的未知類型一定是Shape的子類也可以是Shape,因此可以把shape稱爲這個通配符的上限

9.3.3設定參數類型的上限

設置類型形參上限,用於表示傳給該類型的實際類型要麼是該上限類型,要麼是給上限類型的子類

與類同時繼承父類、實現接口類似的是,爲類型形參指定多個上限時,所有的接口上限必須位於類上限之後

9.4 泛型方法

9.4.1 定義泛型方法

修飾符 <T , S> 返回值類型 方法名(形參列表){

方法體。。。

}

 

大部分時候泛型方法都可以代替類型通配符

 

9.4.2 泛型方法和通配符的區別

類型形參T 產生的唯一效果是可以在不同的調用點傳入不同的實際類型,通配符是被設計來支持靈活的子類化的

泛型方法允許類型參數被用來表示方法的一個或多個參數之間的類型依賴關係,或者方法返回值與參數之間的類型依賴關係,如果沒有這種依賴關係就沒有必要使用泛型方法

 

9.4.3 泛型構造器

java允許在構造器簽名中聲明類型形參 這就是所謂的泛型構造器

一旦定義了泛型構造器,不僅可以染java根據數據參數類型來推斷類型參數的類型,而且可以染程序員也可以顯示地爲構造器類型參數指定實際的類型

9.4.4設定通配符下限

<? super Type>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章