泛型字母
形式類型參數(shù)(formal
type parameters)即泛型字母
命名:泛型字母可以隨意指定,盡量使用單個的大寫字母(有時候多個泛型類型時會加上數(shù)字莲组,比如T1萍启,T2)
常見字母(見名知意)
?T:Type
?K V:Key Value
?E:Element
?泛型聲明形式之一:泛型類余寥、接口
需求:定義學生類怎爵,其中有學生成績
?整數(shù)
?小數(shù)
字符串“優(yōu)秀永罚、良好啤呼、合格议薪、不及格”
聲明時的要點
?在類/接口上聲明的泛型,在本類或本接口中即代表某種類型媳友,可以作為非靜態(tài)屬性的類型斯议、非靜態(tài)方法的參數(shù)類型、非靜態(tài)方法的返回值類型
?在類/接口上聲明的泛型不能使用在靜態(tài)成員上
泛型類的構造器如下:public GenericClass(){}醇锚。
而如下是錯誤的:public GenericClass(){}
?泛型類在聲明時還可以指定泛型的上限
指定時的要點
?當類或接口被使用時哼御,會使用具體的實際類型參數(shù)(actual type argument)代替
?泛型的指定中不能使用基本數(shù)據(jù)類型,可以使用包裝類替換
?泛型如果不指定焊唬,將被擦除恋昼,泛型對應的類型均按照Object處理,但不等價于Object
例如:
(1)ArrayList list = newArrayList();?? 聲明集合變量或創(chuàng)建集合對象赶促,指定泛型
(2)class Dog implementsComparable{...}?? 實現(xiàn)接口時液肌,指定泛型
(3)public voidtest(ArrayList list){}?????使用泛型類或接口作為形參時,此處指定為學生類型
(4)public void test(ArrayListlist){}??????????? 使用泛型類或接口作為形參時鸥滨,此處指定為任意類型
(5)public void test(ArrayList? 使用泛型類或接口作為形參時嗦哆,此處指定為Person或其子類
(6)public void test(ArrayList????? 使用泛型類或接口作為形參時,此處指定為Son或其父類
關于泛型類/接口的繼承/實現(xiàn)說明
父類有泛型婿滓,子類可以選擇保留泛型也可以選擇指定泛型類型:
?子類不保留父類的泛型:按需實現(xiàn)
?沒有類型? 擦除
?具體類型
?子類保留父類的泛型:泛型子類
?全部保留
?部分保留
結論:子類必須是“富二代”老速,子類除了指定或保留父類的泛型,還可以增加自己的泛型
具體示例代碼
關于泛型的擦除說明
使用泛型類時未指定泛型的具體類型:類似于Object凸主,不等同于Object
?泛型擦除橘券,默認按照Object處理但編譯不會類型檢查
?明確指定Object,編譯會按Object類型檢查
泛型形式之二:泛型方法
?如果某個類不是泛型類卿吐,而某個方法需要使用泛型
?如果某個類是泛型類旁舰,但是需要在靜態(tài)方法上使用泛型
泛型方法的格式:
[訪問權限]? <泛型字母>? 返回類型? 方法名([泛型字母參數(shù)名稱])? 拋出的異常
示例:java.util.Arrays類
?public static List asList(T... a)
注意:Arrays.asList(…) 方法返回的 List 集合既不是ArrayList 實例,也不是 Vector 實例嗡官。 Arrays.asList(…)?返回值是一個固定長度的List 集合
?public static T[] copyOf(T[] original, int newLength)
?public static T[] copyOfRange(T[] original, int from,intto)
注意:
?泛型方法可以是靜態(tài)方法也可以是非靜態(tài)方法
?泛型方法聲明泛型時也可以指定上限