蕪湖哪家公司做網(wǎng)站不錯什么叫seo網(wǎng)絡(luò)推廣
Java泛型的局限和使用經(jīng)驗
泛型的局限
- 任何基本類型不能作為類型參數(shù)
經(jīng)過類型擦除后,List中包含的實際上還是Object的域,而在Java類型系統(tǒng)中Object和基本類型是兩套體系,需要通過“自動裝包、拆包機制”來進行交互。
2.任何在運行時需要知道確切類型信息的操作都無法工作。
由于Java的泛型是編譯期泛型(在進入運行時后沒有泛型的概念),因此運行時的類型轉(zhuǎn)換和類型判定等操作都沒有效果。
3.沖突1:方法名一樣,參數(shù)列表是同一個類型參數(shù)的兩個泛型方法,重載將產(chǎn)生相同的函數(shù)簽名;
在泛型擦除后,這兩個方法簽名完全相同,產(chǎn)生沖突;
4.沖突2:使用泛型接口時,需要避免重復(fù)實現(xiàn)同一個接口
5.不能在靜態(tài)域或方法中引用類型參數(shù)
在方法的簽名里多了一個static關(guān)鍵字,然后引發(fā)編譯錯誤的原因就變成了:在靜態(tài)域中無法引用類型變量
泛型的常用經(jīng)驗
- 盡量消除異常,初學(xué)者容易寫出使用原生類型的代碼,或者使用泛型不當(dāng)?shù)拇a,現(xiàn)在編輯器非常先進,盡量消除提示的異常;對于開發(fā)者自己確認不需要消除切可以工作的代碼,可以使用@SuppressWarnings("unchecked")屏蔽掉異常;
- 能用泛型類(或接口)的時候盡量使用;能用泛型方法的時候盡量使用泛型方法;
- 定義API時,盡量使用泛型;
?泛型的概述
泛型:參數(shù)化類型
類型形參:<T>,<E>,<K>,<V>,<U>,<R>。。。。
類型實參:必須是引用數(shù)據(jù)類型,不能是基本數(shù)據(jù)類型
? ? ? ?<String>,<Integer>,<Student>,<ArrayList<String>>……
形式一:泛型類與泛型接口
1、聲明語法格式:
【修飾符】 class 類名/接口<類型形參列表>{ ??
?
}?
?
【修飾符】 class 類名/接口<類型形參1 extends 父類上限>{ ??
?
}
?
【修飾符】 class 類名/接口<類型形參1 extends 父類上限 & 父接口上限>{ ??
?
}
在類名或接口名后面聲明的泛型形參類型,可以在當(dāng)前類或接口中使用,用作聲明成員變量、方法的形參、方法的返回值。
但是不能用于靜態(tài)成員上
2、使用語法格式
在(1)創(chuàng)建泛型類、泛型接口的對象時,為泛型形參指定具體類型
? ? ? ?(2)在繼承泛型類或?qū)崿F(xiàn)泛型接口時,為泛型形參指定具體類型
示例代碼
ArrayList<String> list = new ArrayList<String>();
?
ArrayList<String> list = new ArrayList<>();//JDK1.7之后可以省略
?
?class MyStringArrayList extends ArrayList<String>{
?
}?
?
class Employee implements Comparable<Employee>{
?
? ?public int compareTo(Employee e){ ? ? ??
?
? }
?
}?
?
Arrays.sort(數(shù)組, ?new ?Comparator<泛型實參>(){
?
? ?public int compare(泛型實參類型 ?o1, 泛型實參類型 ?o2){ ? ? ??
?
? }
?
});
3、泛型如果沒有指定,會被擦除,按照最左邊的上限處理,如果沒有指定上限,按照Object處理
形式二:泛型方法
1、聲明的語法格式
【修飾符】 <泛型形參列表> 返回值類型 方法名(【數(shù)據(jù)形參列表】)【throws 異常列表】{}
【修飾符】 <泛型形參 extends 父類上限 & 父接口上限> 返回值類型 方法名(【數(shù)據(jù)形參列表】)【throws 異常列表】{}
(1)在方法返回值類型前面聲明的泛型形參類型,只能在當(dāng)前方法中使用,用于表示形參的類型或返回值類型,或方法局部變量的類型,和別的方法無關(guān)。
(2)泛型方法可以是靜態(tài)方法,也可以是非靜態(tài)方法
2、 使用
當(dāng)調(diào)用方法,會根據(jù)具體的數(shù)據(jù)的實參的類型,來確定泛型實參的類型。
通配符?
(1)?:代表任意引用數(shù)據(jù)類型
(2)? extends 上限:代表上限本身或它的子類
(3)? super 下限:代表下限本身或它的父類
例如:
ArrayList<?>:表示可以接受任意類型
ArrayList<?> list = new ArrayList<String>();
?
ArrayList<?> list = new ArrayList<Integer>();
?
ArrayList<?> list = new ArrayList<Animal>();
ArrayList<? extends 上限>:
ArrayList<? extends Person> list = new ArrayList<Person>();
?
ArrayList<? extends Person> list = new ArrayList<Animal>();//Animal不行,因為Animal是父類
?
ArrayList<? extends Person> list = new ArrayList<Student>();
?
ArrayList<? extends Person> list = new ArrayList<Dog>();//Dog也不行
ArrayList<? super 下限>:
ArrayList<? super Person> list = new ArrayList<Person>();
?
ArrayList<? super Person> list = new ArrayList<Animal>();
?
ArrayList<? super Person> list = new ArrayList<Student>();//Student,因為Student是子類
?
ArrayList<? super Person> list = new ArrayList<Dog>();//Dog也不行
ArrayList<?>:不能添加元素,除了null
ArrayList<? extends 上限>:不能添加元素,除了null
ArrayList<? super 下限>:可以添加下限或下限子類的對象
?Collections工具類
java.util.Collections:工具類,操作集合
(1)public static <T> boolean addAll(Collection<? super T> c, T... elements)
添加elements的幾個對象到c集合中。T是elements對象的類型,要求Collection集合的元素類型必須是T或T的父類
(2)public static <T> int binarySearch(List<? extends Comparable<? super T>> list,T key)
在list集合中用二分查找key的下標,如果存在返回的是合理的下標,如果不存在返回的是一個負數(shù)下標
T是元素的類型,
<? extends Comparable<? super T>>,要求集合的元素必須實現(xiàn)Comparable接口
<? super T>,在實現(xiàn)Comparable接口,可以指定Comparable<類型實參>為T或T的父類。
(3)public static boolean disjoint(Collection<?> c1, Collection<?> c2)
判斷c1和c2沒有交集就為true
(4)public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)
求coll集合中最大元素
<T extends Object & Comparable<? super T>>:要求T或T的父類實現(xiàn)Comparable接口
(5)public static <T extends Comparable<? super T>> void sort(List<T> list) 給list集合排序
<T extends Comparable<? super T>>:要求T或T的父類實現(xiàn)Comparable接口
(6)public static <T> Collection<T> synchronizedCollection(Collection<T> c)
以synchronizedXX開頭的方法,表示把某種非線程安全集合轉(zhuǎn)為一個線程安全的集合。
(7)public static <T> List<T> unmodifiableList(List<? extends T> list)