Java的數據類型通常都是在定義時就須要肯定,這種強制的好處就是類型安全,不會出現像弄一個ClassCastException的數據給jvm,數據安全那麼執行的class就會很穩定。可是假如說我不知道這個參數要傳什麼類型的,由於公司需求在變,若是寫死的那就只能便以此需求就改一次,很麻煩。sun公司也注意到這個問題,這樣會讓代碼的靈活性下降,他們就研究出了泛型。數組
什麼是泛型,能夠字面理解就是一個泛泛的類型,他是不肯定的,在Java代碼編譯的時候用泛型是不會出錯的,而在運行期時就會報錯,說你這種第一是不合理的。這是爲何呢。由於爲了提升靈活性,就在編譯時期將條件放寬,可是泛型必定要在運行的時候告訴jvm你給個人數據究竟是什麼類型的,不然jvm會是懵逼的。因此泛型的好處就是將類型的靈活性提升,也只是在Java語法的基礎上提升,不過泛型仍是比較實用的。安全
泛型的應用場景就是應用在模型(能夠理解爲存儲數據的盒子),我爲了這個盒子適用更多的地方我就用將須要存入的數據用一個泛型表示,固然能夠傳入多值。若是是相同類型的對象就用一個泛型的數組比較好,學過集合的小夥伴應該都知道,沒學過的那你應該補補課了。app
泛型的語法jvm
public class A<T extends B>{ T t; }
泛型的雖然強大,可是世界上任何東西東部是完美的。它也有缺陷。好比說我有一個盒子我想裝蘋果,可是我還可能想裝香蕉那怎麼辦。那還很差說,在給一個參數不就好了,那十個呢,二十個呢。em....的確是。若是說咱們想裝的東西都屬於一個類而且只要是這個類的子類就能夠裝。這個想法sun爲咱們想好了。那就是用上邊界通配符。語法是
上邊界Java代碼this
public class Dish<T extends Fruit>{ private T fruitChild; public Dish(T fruitChild){ this.fruitChild = fruitChild; } public T getFruitChild(){ return fruitChild; } public void setFruitChild(T f){ this.fruitChild = f; } public static void main(String[] args){ Dish dish = new Dish<apple>(); Apple apple = new apple(); //apple must be Fruit child; dish.setFruitChild(apple); system.out.printf(dish.getFruitChild); } }
下邊界Java代碼code
public class Dish<T super Apple>{ private T appleFather; public Dish(T appleFather){ this.appleFather = appleFather; } public T getAppleFather(){ return appleFather; } public void setAppleFather(T f){ this.appleFather = f; } public static void main(String[] args){ Dish dish = new Dish<Fruit>(); Fruit fruit = new Fruit(); //fruit must be apple son; dish.setAppleFather(fruit); system.out.printf(dish.getAppleFather); } }
當泛型T給定形如
當泛型T給定形如
上界<? extends T>不能往裏存,只能往外取。get
由於編譯器只知道傳入的是T的子類,但具體是哪個編譯器不知道,他只標註了一個佔位符,當?傳過來時,他不知道這能不能和佔位符匹配,因此set不了。
下界<? super T>不影響往裏存,但往外取只能放在Object對象裏。
由於下邊界已經限制了?的粒度,他只多是T自己或者是T的父類。咱們想一想,我想要一個T,你卻返回給我一個比T小的Object,這樣咱們就由於精度損失而拿不到想要的數據了。
感謝各位童鞋的閱讀,但願你們動一動發財的小手點一下推薦QAQ。