【先寫個例子,幫助理解泛型的格式】
ArrayList<String> list = new ArrayList<String>();//【標準格式】
ArrayList<Object> list = new ArrayList<String>(); //false
ArrayList<String> list = new ArrayList<Object>(); //false
【允許的,爲了照顧新老版本問題 】 Android開發中
ArrayList list3 = new ArrayList<String>(); true 語法沒有問題, 但是會報警告
ArrayList<String> list2 = new ArrayList(); true 語法沒有問題, 但是會報警告
*********************************************************************************************
集合中的泛型
在集合的代碼中,有兩個很特殊東西
<? extends E>
<? super E>
E 是泛型
extends 繼承
super 調用父類方法的關鍵字
? 通配符
需求1:定義一個函數可以接受任意類型,但是這個任意類型必須是數值類型
也就是Number類或者Number的子類
這裏約束的是【泛型的上限】
Integer extends Number
Float extends Number
Double extends Number
? extends Number
上限:
? extends 要求的數據類型,這裏要求能夠使用的數據類型是要求數據類型本身或者其子類數組
需求2: 定義一個函數只能接受Integer類型或者其父類類型的集合
下限:
? super 要求的數據類型 這裏要求能夠使用的數據類型是要求的數據類型本身及其父類
泛型中通配符:
?
************************************************************************************************************
自定義泛型
泛型的運用:
需求:
定義一個方法,可以接收任意類型的參數,而且要求返回值類型也是接收的數據類型
例如:接收String 返回String
接收int 返回int
自定義泛型!
定義一個標識符!,格式 <大寫字母>
1.在函數中使用泛型格式:
修飾符 <聲明自定義泛型的佔位符> 返回值類型//返回值也可以是泛型 函數名(自定義泛型 參數列表, 其他數據類型 參數列表) {
}
泛型中不能直接使用基本數據類型,都是有對應的包裝類型
byte --> Byte
short --> Short
int --> Integer
long --> Long
double --> Double
float --> Float
boolean --> Boolean
char --> Character
2.類使用泛型
在自定義類中使用自定義泛型
class 類名<自定義泛型> {
//在這裏所用用到和類名一致的自定義泛型的位置,都是相同的數據
}
注意:
1. 類名中聲明瞭自定義泛型的情況下,如果該類中使用了和類名自定義相同的泛型,不能用到
static修飾的方法中 【在static修飾的方法中不能使用類名聲明的自定義泛型】
2. 當一個類使用了自定義泛型,在創建該類的對象的時候,給予了泛型的具體類型,那麼在這個類
當中所有使用到這個泛型的位置都會變成這個具體的數據類型
3. 如果一個要求有泛型的類對象,在創建的時候沒有給予具體的數據類型,所有使用到該泛型的
位置都會變成Object
[問題]
在一個用泛型修飾的類當中,static修飾的方法,能否使用泛型???
如果是static修飾的方法, 指定使用當前方法自定義的泛型
3.接口中使用自定義泛型
interface 接口名<自定義泛型> {
成員變量; //public static final
成員方法; //abstract
}
注意事項:
( 1). 如果一個類【遵從】接口,而且這個接口是帶有自定義泛型的,那麼這個類就是要在類名之後加上對應
泛型
(2). 如果一個類【遵從】接口,而且這個接口是帶有自定義泛型的,那麼裏面所有【遵從】接口要完成的方法
使用到的泛型,都是接口規定的泛型
(3.) 有兩種【遵從】方式,第一種:使用泛型【遵從】 第二種:【遵從】的時候,給定具體的數據類型
PlanA:
這個泛型的具體數據類型是通過用戶創建該類的對象時提供的,可以更加具體的使用情況,做成
不同的數據類型
PlanB:
這個泛型在【遵從】時已經確定,那麼這個泛型意義不大
[推薦使用PlanA,根據實際情況,確定泛型的類型}