本篇文章給大家分享的是有關(guān)JDK5.0新特性的泛型怎么理解,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
成都創(chuàng)新互聯(lián)成立于2013年,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元鹽城做網(wǎng)站,已為上家服務(wù),為鹽城各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220
沒(méi)有參數(shù)的情況下使用泛型
既然在J2SE 5.0中收集類型已經(jīng)泛型化,那么,原來(lái)的使用這些類型的代碼將如何呢?很幸運(yùn),他們?cè)贘AVA 5中將繼續(xù)工作,因?yàn)槟隳苁褂脹](méi)有參數(shù)的泛型。比如,你能繼續(xù)像原來(lái)一樣使用List接口,正如下面的例子一樣。
List stringList1 = new ArrayList(); stringList1.add("Java 1.0 - 5.0"); stringList1.add("without generics"); String s1 = (String) stringList1.get(0);
一個(gè)沒(méi)有任何參數(shù)的泛型被稱為原型(raw type)。它意味著這些為JDK1.4或更早的版本而寫的代碼將繼續(xù)在java 5中工作。
盡管如此,一個(gè)需要注意的事情是,JDK5編譯器希望你使用帶參數(shù)的泛型。否則,編譯器將提示警告,因?yàn)樗J(rèn)為你可能忘了定義類型變量s。比如,編譯上面的代碼的時(shí)候你會(huì)看到下面這些警告,因?yàn)榈谝粋€(gè)List被認(rèn)為是原型。
Note: com/brainysoftware/jdk5/app16/GenericListTest.java
uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
當(dāng)你使用原型時(shí),如果你不想看到這些警告,你有幾個(gè)選擇來(lái)達(dá)到目的:
1.編譯時(shí)帶上參數(shù)-source 1.4
2.使用@SupressWarnings("unchecked")注釋
3.更新你的代碼,使用List. List的實(shí)例能接受任何類型的對(duì)象,就像是一個(gè)原型List。然而,編譯器不會(huì)報(bào)錯(cuò)。
使用 ? 通配符
前面提過(guò),如果你聲明了一個(gè)List, 那么這個(gè)List對(duì)aType起作用,所以你能儲(chǔ)存下面這些類型的對(duì)象:
1.一個(gè)aType的實(shí)例
2.它的子類的實(shí)例(如果aType是個(gè)類)
3.實(shí)現(xiàn)aType接口的類實(shí)例(如果aType是個(gè)接口)
但是,請(qǐng)注意,一個(gè)泛型本身是個(gè)JAVA類型,就像java.lang.String或java.io.File一樣。傳遞不同的類型變量給泛型可以創(chuàng)建不同的JAVA類型。比如,下面例子中l(wèi)ist1和list2引用了不同的類型對(duì)象。
List
list1 = new ArrayList();
List
list1指向了一個(gè)類型變量s為java.lang.Objects 的List而list2指向了一個(gè)類型變量s為String 的List。所以傳遞一個(gè)List
public static void doIt(List l) {}
在某些情況下你會(huì)考慮使用 ? 通配符。比如,你有一個(gè)printList函數(shù),這個(gè)函數(shù)打印一個(gè)List的所有成員,你想讓這個(gè)函數(shù)對(duì)任何類型的List起作用時(shí)。否則,你只能累死累活的寫很多printList的重載函數(shù)。下面的列表引用了使用 ? 通配符的printList函數(shù)。
public class WildCardTest {
public static void printList(List list) {
for (Object element : list) {
System.out.println(element);
}
}
public static void main(String[] args) {
List
list1.add("Hello");
list1.add("World");
printList(list1);
List
list2.add(100);
list2.add(200);
printList(list2);
}
}
這些代碼說(shuō)明了在printList函數(shù)中,List表示各種類型的List對(duì)象。然而,請(qǐng)注意,在聲明的時(shí)候使用 ? 通配符是不合法的,像這樣:
List myList = new ArrayList(); // 不合法
ListmyList = new ArrayList();
在函數(shù)中使用界限通配符