泛型
Java泛型設(shè)計(jì)原則:只要在編譯時(shí)期沒(méi)有出現(xiàn)警告,那么運(yùn)行時(shí)期就不會(huì)出現(xiàn)ClassCastException異常.
泛型:把類(lèi)型明確的工作推遲到創(chuàng)建對(duì)象或調(diào)用方法的時(shí)候才去明確的特殊的類(lèi)型
參數(shù)化類(lèi)型:
- 把類(lèi)型當(dāng)作是參數(shù)一樣傳遞
- <數(shù)據(jù)類(lèi)型> 只能是引用類(lèi)型
相關(guān)術(shù)語(yǔ):
- ArrayList<E>中的E稱(chēng)為類(lèi)型參數(shù)變量
- ArrayList<Integer>中的Integer稱(chēng)為實(shí)際類(lèi)型參數(shù)
- 整個(gè)稱(chēng)為ArrayList<E>泛型類(lèi)型
- 整個(gè)ArrayList<Integer>稱(chēng)為參數(shù)化的類(lèi)型ParameterizedType
有了泛型以后:
- 代碼更加簡(jiǎn)潔【不用強(qiáng)制轉(zhuǎn)換】
- 程序更加健壯【只要編譯時(shí)期沒(méi)有警告,那么運(yùn)行時(shí)期就不會(huì)出現(xiàn)ClassCastException異?!?/li>
- 可讀性和穩(wěn)定性【在編寫(xiě)集合的時(shí)候,就限定了類(lèi)型】
類(lèi)型通配符
現(xiàn)在有個(gè)需求:方法接收一個(gè)集合參數(shù),遍歷集合并把集合元素打印出來(lái),怎么辦?
public void test(List<?> list){
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
}
?號(hào)通配符表示可以匹配任意類(lèi)型,任意的Java類(lèi)都可以匹配。
現(xiàn)在非常值得注意的是,當(dāng)我們使用?號(hào)通配符的時(shí)候:就只能調(diào)對(duì)象與類(lèi)型無(wú)關(guān)的方法,不能調(diào)用對(duì)象與類(lèi)型有關(guān)的方法。
記住,只能調(diào)用與對(duì)象無(wú)關(guān)的方法,不能調(diào)用對(duì)象與類(lèi)型有關(guān)的方法。因?yàn)橹钡酵饨缡褂貌胖谰唧w的類(lèi)型是什么。也就是說(shuō),在上面的List集合,我是不能使用add()方法的。因?yàn)閍dd()方法是把對(duì)象丟進(jìn)集合中,而現(xiàn)在我是不知道對(duì)象的類(lèi)型是什么。