泛型學(xué)習(xí)目錄:
Java泛型-1(泛型的定義)
Java泛型-2(通配符)
Java泛型-3(實(shí)踐篇-protostuff序列化與反序列化)
Java泛型-4(類型擦除后如何獲取泛型參數(shù))
請注意:泛型里面不能使用基本數(shù)據(jù)類型。例如Box<int>
泛型官網(wǎng)地址
1.1 泛型的作用
為啥用:編譯期提供類型檢查以及消除類型轉(zhuǎn)換。
在哪用:泛型用在定義類、接口、方法處。

1.2 泛型參數(shù)命名規(guī)則
泛型參數(shù)名稱是單個(gè)大寫字母。和您了解的變量命名規(guī)則不同。因?yàn)槿绻麤]有這種約定的話,就很難區(qū)分泛型參數(shù)和普通類或接口的名稱。
- E-Element (Java Collection框架大量使用)
- K-Key
- N-Number
- T-Type (對象類型)
- V-Value
- S,U,V等 ( 第二,第三,第四個(gè)類型)
1.3 泛型類的定義
class name<T1,T2,...,Tn>
類型參數(shù)部分被一對尖括號(<>)劃分,他指定了類型參數(shù)也叫類型變量,即T1,T2,...,Tn。
泛型類代碼實(shí)現(xiàn):
在類上聲明泛型,那么這個(gè)泛型類型可以在類中任意地方使用。
//這個(gè)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)然泛型接口也是這樣的原則。
泛型類可以有多個(gè)參數(shù)時(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)用和實(shí)例化泛型類型
要是在代碼中引用泛型類Box,必須執(zhí)行 泛型類型調(diào)用,把T替換成具體的值。
Box<Integer> box=new Box<Interger>(); //此時(shí)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)前的方法的泛型類型可以和類的泛型類型不一致。