JAVA編程思想學習(十五章)泛型

範型的使用場景:

1.類的內部有不確定的屬性,可以用範型來表示

2.某個參數居然限制性,比如必須是誰的子類,或必須是誰的父類。

 

簡單泛型:

1.最常見的泛型應用應該是 容器類和數組了

2。

3.自己定義一個泛型類

定義範型變量的時候使用T(Type)  E(Element) K,V(鍵值),一目瞭然,見名思意,   如果定義的時候使用String 會怎麼樣呢?

String類就被覆蓋了,  String這個名字就指的範型類了。

//使用時不指定範型  不指定默認就是Object

//繼承泛型類的時候

1.可以給父類直接 定義範型類型(String),也可以不定義,不定義默認就是Object  ,當然也可以繼 續使用<T>

2.自己依舊不能直接指定String 還是會覆蓋String

//實現範型接口與繼承範型類差不多規則如下:

//範型申明 不具備繼承關係

舉例如下:

 

//看下方這段有意思的代碼

這段代碼很有趣, FancyToy的父類是 Toy   你不能Class<Toy> up = ftClass.getSuperClass(),必須用Class<? super FancyToy>up = ftClass.getSuperclass();  這裏只能用這種模糊的處理所以  Object obj = up.newInstance(); 所以他的實例也只能用Object來接收

 

範型擦除:

範型的應用通常是在編譯期完成的,在執行階段已被擦除

 

4.以下這4種寫法的區別要理解:

第三種 我的引用變量是範型String ,而NEW出來的是Object 所以直接轉型了。

第四種  我的引用變量是Object ,而new出來的是範型String ,所以又被強轉爲Object了

 

5。無法直接通過範型創建範型數組, 但是有個小技巧可以實現,如下圖

 

// 小知識

obj  instanceof   TYPE

可以用 Class.isInstance(clazz) 替代

 

 

 

2 泛型類  和 泛型方法

泛型方法可以存在於泛型類中,也可以存在於普通的類中,沒什麼關係

泛型方法的格式:在返回值前面加<類型參數>

public <T> void f(T x)

使用泛型類時,必須在創建對象的時候指定類型參數的值,而使用泛型方法的時候,通常不必指明參數類型,因爲編譯器會爲我們找出具體的類型。這稱爲類型參數推斷。因此我們可以像調用普通方法一樣調用f(),而且就好像是f()被無限次地重載過。他甚至可以接受類本身。

<? extends T>泛型的類型自動推斷只是用於賦值,傳參可不行

class Fruit {}

class Apple extends Fruit{}

那麼  fruit[] fruit = new Apple[10];  編譯可行!!

運行時會拋出異常!

 

這種範型集合,會導致你沒辦法添加任何對象,因爲你不知道添加進去的倒地是什麼類型,但是你要是get  是可以的, 至少編譯器知道 get的都是Fruit

<? super Apple> 詐一看就好像<? extend Apple>的反義詞,但其實不是他們是同義詞  前者的意思是 Apple是該類型參數的爸爸,  後者的意思是某個Aplle的兒子

<? super T>傳參也可以

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