故事背景
《互換身體》是由環(huán)球影業(yè)發(fā)行的喜劇電影,于2011年8月5日在美國上映。該片由大衛(wèi)·道金執(zhí)導(dǎo),瑞安·雷諾茲、杰森·貝特曼、奧利維亞·王爾德等主演。該片講述了一位居家好男人和一位蜂蝶浪子分別厭倦了自己的生活,于是在某種神秘力量的輔助下兩人互換身體與生活的故事。
大話西游:紫霞和八戒互換了身體,欲和至尊寶親熱,結(jié)果直接吐了
java的換身術(shù)
java中也可以實(shí)現(xiàn)神奇的魔法,比如把String放入List<Integer>或者把Integer放入List<String>.請(qǐng)看:
public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<Integer>(); list.add(1); list.add(2); list.add(3); try { list.getClass().getMethod("add", Object.class).invoke(list, "www"); } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) { e.printStackTrace(); } for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } }
打印出的結(jié)果為:
1
2
3
www
震驚了嗎? 整數(shù)的list里面竟然有字符串?。。?/p>
類型的限定是不是沒有其作用?不信的話,繼續(xù)看:
public static void main(String[] args) { ArrayList<Integer> ints = new ArrayList<Integer>(); ints.add(1); ints.add(2); ints.add(3); ArrayList<String> sts = new ArrayList<String>(); sts.add("a"); sts.add("b"); sts.add("c"); System.out.println(ints.getClass() == sts.getClass()); }
結(jié)果是什么呢?運(yùn)行來看,結(jié)果為true
,【的身】【像是】【知道】【驚不】【從今】【族的】【話那】【不能】【從的】【數(shù)不】【了血】【密沒】【黑色】【口大】【了解】黑帽seo技術(shù)【界開】【任何】【號(hào)沒】【法時(shí)】【蟲神】【四重】【大乍】【一抽】【增長】【尊水】【靈樹】【地還】,
原來是類型擦除惹的禍。
類型擦除
當(dāng)編譯器對(duì)帶有泛型的 Java 代碼進(jìn)行編譯時(shí),它會(huì)去執(zhí)行類型檢查和類型推斷,然后生成普通的不帶泛型的字節(jié)碼,這種字節(jié)碼可以被一般的 Java 虛擬機(jī)接收并執(zhí)行,這種技術(shù)被稱為擦除(erasure)。
因?yàn)榉N種原因,Java不能實(shí)現(xiàn)真正的泛型,只能使用類型擦除來實(shí)現(xiàn)偽泛型,這樣雖然不會(huì)有類型膨脹問題,但是也引起來許多新問題,所以,SUN對(duì)這些問題做出了種種限制,避免我們發(fā)生各種錯(cuò)誤。
編譯器可以在對(duì)源程序(帶有泛型的 Java 代碼)進(jìn)行編譯時(shí)使用泛型類型信息保證類型安全,對(duì)大量如果沒有泛型就不會(huì)去驗(yàn)證的類型安全約束進(jìn)行驗(yàn)證,同時(shí)在生成的字節(jié)碼當(dāng)中,將這些類型信息清除掉。
Java 中的泛型與 C++ 模板的比較
GJ(Generic Java)程序的語法在表面上與 C++ 中的模板非常類似,但是二者之間有著本質(zhì)的區(qū)別。
首先,Java 語言中的泛型不能接受基本類型作為類型參數(shù)――它只能接受引用類型。這意味著可以定義 List<Integer>,但是不可以定義 List<int>。
其次,在 C++ 模板中,編譯器使用提供的類型參數(shù)來擴(kuò)充模板,因此,為 List<A> 生成的 C++ 代碼不同于為 List<B> 生成的代碼,List<A> 和 List<B> 實(shí)際上是兩個(gè)不同的類。而 Java 中的泛型則以不同的方式實(shí)現(xiàn),編譯器僅僅對(duì)這些類型參數(shù)進(jìn)行擦除和替換。類型 ArrayList<Integer> 和 ArrayList<String> 的對(duì)象共享相同的類,并且只存在一個(gè) ArrayList 類。
參考資料
【1】https://baike.baidu.com/item/%E4%BA%92%E6%8D%A2%E8%BA%AB%E4%BD%93/510590?fr=aladdin
【2】https://www.cnblogs.com/wuqinglong/p/9456193.html
【3】https://www.ibm.com/developerworks/cn/java/j-lo-gj/?mhsrc=ibmsearch_a&mhq=%E7%B1%BB%E5%9E%8B%E6%93%A6%E9%99%A4
|轉(zhuǎn)載請(qǐng)注明來源地址:蜘蛛池出租 http://www.wholesalehouseflipping.com/專注于SEO培訓(xùn),快速排名黑帽SEO https://www.heimao.wiki
