1.類的內部有不肯定的屬性,能夠用範型來表示數組
2.某個參數竟然限制性,好比必須是誰的子類,或必須是誰的父類。ui
簡單泛型:spa
1.最多見的泛型應用應該是 容器類和數組了3d
2。對象
定義範型變量的時候使用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>傳參也能夠