泛型在編譯期和運(yùn)行期的作用:囱稽?匆绣?
Java泛型詳解
我們先來(lái)看一下下面這個(gè)例子:
Object[] strings = new String[2];
strings[0] = "hi"; // OK
strings[1] = 100; // An ArrayStoreException is thrown.
對(duì)于上面這段代碼還是很好理解,字符串?dāng)?shù)組不能存放整型元素集漾,而且這樣的錯(cuò)誤往往要等到代碼運(yùn)行的時(shí)候才能發(fā)現(xiàn)合蔽,編譯器是無(wú)法識(shí)別的。接下來(lái)我們?cè)賮?lái)看一下假設(shè)Java支持泛型數(shù)組的創(chuàng)建會(huì)出現(xiàn)什么后果:
Object[] stringLists = new List<String>[]; // compiler error, but pretend it's allowed
stringLists[0] = new ArrayList<String>(); // OK
// An ArrayStoreException should be thrown, but the runtime can't detect it.
stringLists[1] = new ArrayList<Integer>();
假設(shè)我們支持泛型數(shù)組的創(chuàng)建谓松,由于運(yùn)行時(shí)期類型信息已經(jīng)被擦除,JVM實(shí)際上根本就不知道new ArrayList<String>()和new ArrayList<Integer>()的區(qū)別践剂。類似這樣的錯(cuò)誤假如出現(xiàn)才實(shí)際的應(yīng)用場(chǎng)景中鬼譬,將非常難以察覺。
泛型程序設(shè)計(jì)意味著編寫的代碼可以被很多不同類型的對(duì)象所重用逊脯。例如优质,我們不希望為聚集String和File對(duì)象分別設(shè)計(jì)不同的類。實(shí)際上根本不需要那么做,因?yàn)橐粋€(gè)ArrayList類可以聚集任何類型的對(duì)象巩螃。這是一個(gè)泛型程序設(shè)計(jì)的實(shí)例演怎。
在Java類庫(kù)中使用變量E表示集合元素類型,K表示關(guān)鍵字類型避乏,V表示值的類型爷耀,T表示任意類型。
在普通類中淑际,定義泛型方法示例如下圖所示:
如果你想從一個(gè)數(shù)據(jù)類型里獲取數(shù)據(jù)畏纲,使用 ? extends 通配符,只能讀,不能寫
如果你想把對(duì)象寫入一個(gè)數(shù)據(jù)結(jié)構(gòu)里春缕,使用 ? super 通配符盗胀,只能寫,不能讀
https://www.cnblogs.com/softidea/p/4106659.html