泛型學(xué)習(xí)目錄:
Java泛型-1(泛型的定義)
Java泛型-2(通配符)
Java泛型-3(實踐篇-protostuff序列化與反序列化)
Java泛型-4(類型擦除后如何獲取泛型參數(shù))
請注意:泛型里面不能使用基本數(shù)據(jù)類型黎茎。例如Box<int>
泛型官網(wǎng)地址
1.1 泛型的作用
為啥用:編譯期提供類型檢查以及消除類型轉(zhuǎn)換机蔗。
在哪用:泛型用在定義類、接口奈应、方法處照皆。
1.2 泛型參數(shù)命名規(guī)則
泛型參數(shù)
名稱是單個大寫字母厘惦。和您了解的變量命名規(guī)則不同逆日。因為如果沒有這種約定的話颖侄,就很難區(qū)分泛型參數(shù)
和普通類或接口的名稱
。
- E-Element (Java Collection框架大量使用)
- K-Key
- N-Number
- T-Type (對象類型)
- V-Value
- S载萌,U惧财,V等 ( 第二,第三扭仁,第四個類型)
1.3 泛型類的定義
class name<T1,T2,...,Tn>
類型參數(shù)部分被一對尖括號(<>)
劃分垮衷,他指定了類型參數(shù)
也叫類型變量,即T1乖坠,T2搀突,...,Tn
。
泛型類代碼實現(xiàn):
在類上聲明泛型熊泵,那么這個泛型類型可以在類中任意地方使用仰迁。
//這個T的類型,可以在任何地方使用
public class Box<T> {
private T data;
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
我們引入的類型變量T
顽分,可以在類中的任意地方使用徐许。
類型變量可以指定為任意非原始類型的類型:任意的類,任意的接口卒蘸,任意的數(shù)組甚至其他的類型變量雌隅。
當(dāng)然泛型接口也是這樣的原則。
泛型類可以有多個參數(shù)時:
//泛型接口
public interface Pair<K, V> {
public K getKey();
public V getValue();
}
public class OrderPair<K, V> implements Pair<K, V> {
private K key;
private V value;
public OrderPair(K key, V value) {
this.key = key;
this.value = value;
}
@Override
public K getKey() {
return key;
}
@Override
public V getValue() {
return value;
}
}
1.4 調(diào)用和實例化泛型類型
要是在代碼中引用泛型類Box
缸沃,必須執(zhí)行 泛型類型調(diào)用恰起,把T
替換成具體的值。
Box<Integer> box=new Box<Interger>(); //此時T的類型就是傳入的類型
泛型類型調(diào)用與普通方法調(diào)用類似和泌,但不是將參數(shù)傳遞給方法村缸,而是將類型參數(shù)傳遞給Box
類本身。
1.5 泛型方法
泛型方法中
泛型參數(shù)
作用域:僅限于聲明它的方法武氓。允許使用靜態(tài)或者非靜態(tài)的泛型方法梯皿,以及泛型構(gòu)造函數(shù)。泛型方法的語法:若方法
返回類型
是泛型參數(shù)
县恕,需要在方法返回值之前
东羹,聲明<泛型類型>
的格式。
泛型聲明的反例:
異常原因: Cannot resolve symbol 'T'【無法解析符號T】
泛型聲明的正例:
方法返回值前的<T>就是為了告訴編譯器忠烛,當(dāng)前的方法的泛型類型可以和類的泛型類型不一致属提。