作者:lkd_whh
轉(zhuǎn)載請(qǐng)注明出處
泛型的好處
編譯時(shí)期的強(qiáng)類型檢查尔店。有利于提早發(fā)現(xiàn)問(wèn)題封孙,解決問(wèn)題。
不用再使用類型強(qiáng)轉(zhuǎn)匿垄。
能夠利用泛型編寫簡(jiǎn)單易讀的通用代碼移宅。
泛型的使用
-
泛型通常命名規(guī)則
E - Element
K - Key
N - Number
T - Type
V - Value
S,U,V 等等。- 第二椿疗,第三漏峰,第四類型。
-
泛型類的定義和使用届榄。
以最常用的
Arraylist
為例浅乔,我們看下它的定義和使用。當(dāng)我實(shí)例化時(shí)在<>
中傳入的類型為Integer
時(shí),集合中就無(wú)法再放入其他類型的元素了靖苇,從集合中取得元素時(shí)也不用再?gòu)?qiáng)轉(zhuǎn)席噩。(注意:泛型不支持基本類型,但是我們可以使用它的包裝類型)//定義 public class ArrayList<E>{} //使用 ArrayList<Integer> list=new ArrayList<>(); list.add(1); list.add(2l);//編譯錯(cuò)誤,無(wú)法插入Long類型 Integer integer=list.get(0);//能夠直接確定取得的是Integer類型
-
泛型方法贤壁。
聲明方法和泛型類相似悼枢。
作用域僅限于聲明的方法內(nèi)。
靜態(tài)方法脾拆,非靜態(tài)方法馒索,構(gòu)造方法都可以使用。
類型參數(shù)區(qū)段必須出現(xiàn)在方法返回類型之前名船。
/** * 泛型構(gòu)造方法格式 * @param t * @param <T> */ public <T> Generics(T t) { } /** * 非靜態(tài)泛型方法格式 * @param t * @param <T> * @return */ public <T> T getNonStatic(T t) { } /** * 靜態(tài)泛型方法格式 * @param t * @param <T> */ public static <T> voTid getStatic(T t) { }
-
類型限定绰上。關(guān)鍵字
extends
,限制傳入的類型參數(shù)必須為指定的類型或其子類型。/** * 單個(gè)類型限定 * @param t * @param <V> */ public static <V extends Integer> void singleBondedType(V t) { System.out.println(t.intValue()); } /** * 多個(gè)類型限定包帚,需要同時(shí)滿足條件渔期。 * 類型限定聲明中類需要聲明在接口前面 * @param t * @param <V> */ public static <V extends Integer & Comparator> void multipleBondedType(V t) { System.out.println(t.intValue()); System.out.println(t.compare(1,2)); }
-
通配符(Wildcards)
向上有界通配符(Upper Bounded Wildcards)
無(wú)界通配符(Unbounded Wildcards)
向下有界通配符(Lower Bounded Wildcards)
/** * 上有界通配符 * @param list */ public static void upperBoundedWildcards(List<? extends String> list){ } /** * 無(wú)界通配符 * @param list */ public static void unboundedWildcards(List<?> list){ } /** * 下有界通配符 * @param list */ public static void lowerBoundedWildcards(List<? super Integer> list){ }
ps: 你可以用通配符指定一個(gè)上界运吓,也可以指定一個(gè)下界渴邦,但不能同時(shí)指定。
-
泛型的限制
不接受基本類型當(dāng)作參數(shù)拘哨。
不能通過(guò)new泛型來(lái)實(shí)例化對(duì)象谋梭,但是可以通過(guò)反射來(lái)實(shí)現(xiàn)。
不能聲明靜態(tài)泛型變量倦青。
不能對(duì)泛型參數(shù)使用
cast
或instanceof
瓮床。-
不能創(chuàng)建泛型型數(shù)組,比如
List<Integer>[] arrayOfLists = new List<Integer>[2]; // 編譯錯(cuò)誤
-
由于類型擦除機(jī)制产镐,不能通過(guò)泛型重載方法隘庄。
//編譯錯(cuò)誤 public void print(Set<String> strSet) { } public void print(Set<Integer> intSet) { }
?