- 面向?qū)ο蟮囊粋€重要目標(biāo)是對代碼重用的支持凰浮。支持這個目標(biāo)的一個重要的機(jī)制就是泛型機(jī)制牲阁。--《數(shù)據(jù)結(jié)構(gòu)與算法分析Java語言描述》
- Java 5提供了對泛型方法和泛型類的支持叠萍。之前使用繼承的基本原則來實現(xiàn)谓着。
使用Object超類表示泛型
public class Memory{
private Object storedValue;
public Object read(){
return storedValue;
}
public void write(Object o){
storedValue = o;
}
}
public class Test{
public static void main(String [] args){
Memory m= new Memory();
m.write("22");
String val = (String) m.read();
}
}
不能使用基本數(shù)據(jù)類型吼过,只能使用引用類型锐秦,因為它能夠和Object相容。
- 泛型以及泛型集合不是協(xié)變的盗忱,而數(shù)組是協(xié)變的酱床。這樣會使代碼缺少靈活性。Java中提供通配符來彌補(bǔ)不足趟佃。
public static double total(Collection<? extends Shape> arr)
{
double sum = 0
for(Shape s :arr)
{
if(s != null){
sum += s.area();
}
}
return sum;
}
- 常用的 T扇谣,E,K闲昭,V罐寨,?
序矩?表示不確定的 java 類型
T (type) 表示具體的一個java類型
K V (key value) 分別代表java鍵值中的Key Value
E (element) 代表Element
上界通配符 < ? extends E>
下界通配符 < ? super E>
上界通配符主要用于讀數(shù)據(jù)鸯绿,下界通配符主要用于寫數(shù)據(jù)。
類型擦除:
泛型類通過編譯器的類型擦除過程轉(zhuǎn)變成非泛型類贮泞。產(chǎn)生一個與泛型類同名的原始類楞慈。類型參數(shù)會被刪除。
對泛型的限制:
1.基本類型不能用做類型參數(shù)啃擦。
2.在泛型類中囊蓝,static方法和static域不能引用類的類型變量(類型擦除后類型變量就不存在了)。
3.泛型類型不能實例化令蛉。
4.不能創(chuàng)建泛型的數(shù)組
5.instanceof 檢測
Memory<Integer> cell1 = new Memory<>();
cell1.write(4);
Object cell = cell1;
Memory<String> cell2 = (Memory<String>) cell;
String s = cell2.read();//這里產(chǎn)生運(yùn)行錯誤聚霜,類型轉(zhuǎn)換錯誤