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

範型的使用場景:

1.類的內部有不肯定的屬性,能夠用範型來表示數組

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

 

簡單泛型:spa

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

2。對象

3.本身定義一個泛型類

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

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

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

//繼承泛型類的時候get

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>傳參也能夠

相關文章
相關標籤/搜索