精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

面試官:說說什么是泛型的類型擦除?

開發(fā) 前端
本文由面試中常見的一道面試題入手,介紹了java中泛型的類型擦除相關(guān)知識(shí),通過這一過程,也便于大家理解為什么平常總是說java中的泛型是一個(gè)偽泛型,同時(shí)也有助于大家認(rèn)識(shí)到j(luò)ava中泛型的一些缺陷。

[[419148]]

先看一道常見的面試題,下面的代碼的執(zhí)行結(jié)果是什么?

  1. public static void main(String[] args) { 
  2.     List<String> list1=new ArrayList<String>(); 
  3.     List<Integer> list2=new ArrayList<Integer>(); 
  4.     System.out.println(list1.getClass()==list2.getClass()); 

首先,我們知道getClas方法獲取的是對(duì)象運(yùn)行時(shí)的類(Class),那么這個(gè)問題也就可以轉(zhuǎn)化為ArrayList<String>t和ArrayList<Integer>的對(duì)象在運(yùn)行時(shí)對(duì)應(yīng)的Class是否相同?

我們直接揭曉答案,運(yùn)行上面的代碼,程序會(huì)打印true,說明雖然在代碼中聲明了具體的泛型,但是兩個(gè)List對(duì)象對(duì)應(yīng)的Class是一樣的,對(duì)它們的類型進(jìn)行打印,結(jié)果都是:

  1. class java.util.ArrayList 

也就是說,雖然ArrayList<String>和ArrayList<Integer>在編譯時(shí)是不同的類型,但是在編譯完成后都被編譯器簡(jiǎn)化成了ArrayList,這一現(xiàn)象,被稱為泛型的類型擦除(Type Erasure)。泛型的本質(zhì)是參數(shù)化類型,而類型擦除使得類型參數(shù)只存在于編譯期,在運(yùn)行時(shí),jvm是并不知道泛型的存在的。

那么為什么要進(jìn)行泛型的類型擦除呢?查閱的一些資料中,解釋說類型擦除的主要目的是避免過多的創(chuàng)建類而造成的運(yùn)行時(shí)的過度消耗。試想一下,如果用List<A>表示一個(gè)類型,再用List<B>表示另一個(gè)類型,以此類推,無(wú)疑會(huì)引起類型的數(shù)量爆炸。

在對(duì)類型擦除有了一個(gè)大致的了解后,我們?cè)倏纯聪旅娴膸讉€(gè)問題。

類型擦除做了什么?

上面我們說了,編譯完成后會(huì)對(duì)泛型進(jìn)行類型擦除,如果想要眼見為實(shí),實(shí)際看一下的話應(yīng)該怎么辦呢?那么就需要對(duì)編譯后的字節(jié)碼文件進(jìn)行反編譯了,這里使用一個(gè)輕量級(jí)的小工具Jad來(lái)進(jìn)行反編譯(可以從這個(gè)地址進(jìn)行下載:https://varaneckas.com/jad/)

Jad的使用也很簡(jiǎn)單,下載解壓后,把需要反編譯的字節(jié)碼文件放在目錄下,然后在命令行里執(zhí)行下面的命令就可以在同目錄下生成反編譯后的.java文件了:

  1. jad -sjava Test.class  

好了,工具準(zhǔn)備好了,下面我們就看一下不同情況下的類型擦除。

1、無(wú)限制類型擦除

當(dāng)類定義中的類型參數(shù)沒有任何限制時(shí),在類型擦除后,會(huì)被直接替換為Object。在下面的例子中,<T>中的類型參數(shù)T就全被替換為了Object(左側(cè)為編譯前的代碼,右側(cè)為通過字節(jié)碼文件反編譯得到的代碼):

2、有限制類型擦除

當(dāng)類定義中的類型參數(shù)存在限制時(shí),在類型擦除中替換為類型參數(shù)的上界或者下界。下面的代碼中,經(jīng)過擦除后T被替換成了Integer:

3、擦除方法中的類型參數(shù)

比較下面兩邊的代碼,可以看到在擦除方法中的類型參數(shù)時(shí),和擦除類定義中的類型參數(shù)一致,無(wú)限制時(shí)直接擦除為Object,有限制時(shí)則會(huì)被擦除為上界或下界:

反射能獲取泛型的類型嗎?

估計(jì)對(duì)Java反射比較熟悉小伙伴要有疑問了,反射中的getTypeParameters方法可以獲得類、數(shù)組、接口等實(shí)體的類型參數(shù),如果類型被擦除了,那么能獲取到什么呢?我們來(lái)嘗試一下使用反射來(lái)獲取類型參數(shù):

  1. System.out.println(Arrays.asList(list1.getClass().getTypeParameters())); 

執(zhí)行結(jié)果如下:

  1. [E] 

同樣,如果打印Map對(duì)象的參數(shù)類型:

  1. Map<String,Integer> map=new HashMap<>(); 
  2. System.out.println(Arrays.asList(map.getClass().getTypeParameters())); 

最終也只能夠獲取到:

  1. [K, V] 

可以看到通過getTypeParameters方法只能獲取到泛型的參數(shù)占位符,而不能獲得代碼中真正的泛型類型。

能在指定類型的List中放入其他類型的對(duì)象嗎?

使用泛型的好處之一,就是在編譯的時(shí)候能夠檢查類型安全,但是通過上面的例子,我們知道運(yùn)行時(shí)是沒有泛型約束的,那么是不是就意味著,在運(yùn)行時(shí)可以把一個(gè)類型的對(duì)象能放進(jìn)另一類型的List呢?我們先看看正常情況下,直接調(diào)用add方法會(huì)有什么報(bào)錯(cuò):

當(dāng)我們嘗試將User類型的對(duì)象放入String類型的數(shù)組時(shí),泛型的約束會(huì)在編譯期間就進(jìn)行報(bào)錯(cuò),提示提供的User類型對(duì)象不適用于String類型數(shù)組。那么既然編譯時(shí)不行,那么我們就在運(yùn)行時(shí)寫入,借助真正運(yùn)行的class是沒有泛型約束這一特性,使用反射在運(yùn)行時(shí)寫入:

  1. public class ReflectTest { 
  2.     static List<String> list = new ArrayList<>(); 
  3.  
  4.     public static void main(String[] args) { 
  5.         list.add("1"); 
  6.         ReflectTest reflectTest =new ReflectTest(); 
  7.         try { 
  8.             Field field = ReflectTest.class.getDeclaredField("list"); 
  9.             field.setAccessible(true); 
  10.             List list=(List) field.get(reflectTest); 
  11.             list.add(new User()); 
  12.         } catch (Exception e) { 
  13.             e.printStackTrace(); 
  14.         }         
  15.     } 

執(zhí)行上面的代碼,不僅在編譯期間可以通過語(yǔ)法檢查,并且也可以正常地運(yùn)行,我們使用debug來(lái)看一下數(shù)組中的內(nèi)容:

可以看到雖然數(shù)組中聲明的泛型類型是String,但是仍然成功的放入了User類型的對(duì)象。那么,如果我們?cè)诖a中嘗試取出這個(gè)User對(duì)象,程序還能正常執(zhí)行嗎,我們?cè)谏厦娲a的最后再加上一句:

  1. System.out.println(list.get(1)); 

再次執(zhí)行代碼,程序運(yùn)行到最后的打印語(yǔ)句時(shí),報(bào)錯(cuò)如下:

異常提示User類型的對(duì)象無(wú)法被轉(zhuǎn)換成String類型,這是否也就意味著,在取出對(duì)象時(shí)存在強(qiáng)制類型轉(zhuǎn)換呢?我們來(lái)看一下ArrayList中g(shù)et方法的源碼:

  1. public E get(int index) { 
  2.     rangeCheck(index); 
  3.     return elementData(index); 
  4.  
  5. E elementData(int index) { 
  6.     return (E) elementData[index]; 

可以看到,在取出元素時(shí),會(huì)將這個(gè)元素強(qiáng)制類型轉(zhuǎn)換成泛型中的類型,也就是說在上面的代碼中,最后會(huì)嘗試強(qiáng)制把User對(duì)象轉(zhuǎn)換成String類型,在這一階段程序會(huì)報(bào)錯(cuò)。通過這一過程,也再次證明了泛型可以對(duì)類型安全進(jìn)行檢測(cè)。

類型擦除會(huì)引起什么問題?

下面我們看一個(gè)稍微有點(diǎn)復(fù)雜的例子,首先聲明一個(gè)接口,然后創(chuàng)建一個(gè)實(shí)現(xiàn)該接口的類:

  1. public interface Fruit<T> { 
  2.     T get(T param); 
  3.  
  4. public class Apple implements Fruit<Integer> { 
  5.     @Override 
  6.     public Integer get(Integer param) { 
  7.         return param; 
  8.     } 

按照之前我們的理解,在進(jìn)行類型擦除后,應(yīng)該是這樣的:

  1. public interface Fruit { 
  2.     Object get(Object param); 
  3.  
  4. public class Apple implements Fruit { 
  5.     @Override 
  6.     public Integer get(Integer param) { 
  7.         return param; 
  8.     } 

但是,如果真是這樣的話那么代碼是無(wú)法運(yùn)行的,因?yàn)殡m然Apple類中也有一個(gè)get方法,但是與接口中的方法參數(shù)不一致,也就是說沒有覆蓋接口中的方法。針對(duì)這種情況,編譯器會(huì)通過添加一個(gè)橋接方法來(lái)滿足語(yǔ)法上的要求,同時(shí)保證了基于泛型的多態(tài)能夠有效。我們反編譯上面代碼生成的字節(jié)碼文件:

可以看到,編譯后的代碼中生成了兩個(gè)get方法。參數(shù)為Object的get方法負(fù)責(zé)實(shí)現(xiàn)Fruit接口中的同名方法,然后在實(shí)現(xiàn)類中又額外添加了一個(gè)參數(shù)為Integer的get方法,這個(gè)方法也就是理論上應(yīng)該生成的帶參數(shù)類型的方法。最終用接口方法調(diào)用額外添加的方法,通過這種方式構(gòu)建了接口和實(shí)現(xiàn)類的關(guān)系,類似于起到了橋接的作用,因此也被稱為橋接方法,最終,通過這種機(jī)制保證了泛型情況下的Java多態(tài)性。

總結(jié)

本文由面試中常見的一道面試題入手,介紹了java中泛型的類型擦除相關(guān)知識(shí),通過這一過程,也便于大家理解為什么平常總是說java中的泛型是一個(gè)偽泛型,同時(shí)也有助于大家認(rèn)識(shí)到j(luò)ava中泛型的一些缺陷。了解類型擦除的原因以及原理,相信能夠方便大家在日常的工作中更好的使用泛型。

【編輯推薦】

 

責(zé)任編輯:姜華 來(lái)源: 碼農(nóng)參上
相關(guān)推薦

2021-04-19 18:56:58

大數(shù)字符串運(yùn)算

2020-07-22 08:05:44

中間人攻擊

2021-09-08 07:49:34

TypeScript 泛型場(chǎng)景

2025-04-01 00:00:00

項(xiàng)目CRUD單例模式

2023-12-19 09:24:22

LinuxBIOSUEFI

2024-11-19 15:13:02

2025-04-08 00:00:00

@AsyncSpring異步

2025-04-16 00:00:01

JWT客戶端存儲(chǔ)加密令

2023-12-27 18:16:39

MVCC隔離級(jí)別幻讀

2024-08-22 10:39:50

@Async注解代理

2024-03-05 10:33:39

AOPSpring編程

2024-05-30 08:04:20

Netty核心組件架構(gòu)

2021-09-07 10:44:33

Java 注解開發(fā)

2024-06-07 10:05:31

2024-03-14 14:56:22

反射Java數(shù)據(jù)庫(kù)連接

2024-07-31 08:28:37

DMAIOMMap

2024-12-06 07:00:00

2024-02-20 08:13:35

類加載引用Class

2021-11-25 10:18:42

RESTfulJava互聯(lián)網(wǎng)

2024-09-20 08:36:43

零拷貝數(shù)據(jù)傳輸DMA
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

久久九九有精品国产23| 91福利社在线观看| 国产精品三区在线| 麻豆精品久久久久久久99蜜桃| 黄色不卡一区| 91精品国产丝袜白色高跟鞋| 精品人妻少妇一区二区| 国产一区二区三区不卡在线| 国产一区二区在线观看免费| 国内精品久久影院| 天美传媒免费在线观看| 国产一区在线电影| 欧美日韩国产美| 国产青青在线视频| 久久bbxx| 国产午夜精品久久| 国产精品v欧美精品v日韩精品 | 亚洲国产综合网| 久久久久久黄| 欧美精品videossex88| 国产精品成人在线视频| 国内露脸中年夫妇交换精品| 欧美专区亚洲专区| 日本欧美视频在线观看| 色老头视频在线观看| 91麻豆国产福利在线观看| 91精品啪aⅴ在线观看国产| 中文字幕精品无码一区二区| 亚洲国产1区| 久久综合电影一区| 手机av在线不卡| 色先锋久久影院av| 精品欧美乱码久久久久久1区2区| 国产三级三级看三级| 91福利在线免费| 伊人开心综合网| 亚洲va久久久噜噜噜久久狠狠| 色香蕉在线视频| 国产精品888| 91亚洲一区精品| 中文字幕视频免费观看| 日本伊人色综合网| 97超碰国产精品女人人人爽| 国产精品99无码一区二区| 91精品观看| 日韩在线中文字| 午夜黄色福利视频| 色综合久久网| 中文字幕久久久| 激情五月深爱五月| 成人综合一区| 永久免费精品影视网站| 在线免费观看视频| 国产99久久| 亚洲一级一级97网| 中字幕一区二区三区乱码| 欧美人与牛zoz0性行为| 亚洲一区www| 日本一道本视频| 欧美精品乱码| 日韩有码片在线观看| 久久久久人妻一区精品色| 成人激情视频| 久久久精品国产亚洲| 成年人午夜剧场| 欧美私人啪啪vps| 久久久日本电影| 五月婷婷亚洲综合| 日韩精品亚洲一区二区三区免费| 国产成人一区二| 中文字幕丰满人伦在线| 国产综合色精品一区二区三区| 国产日韩在线观看av| 国产乱淫a∨片免费视频| 国产精品一区二区在线播放 | 国产精品女同一区二区三区| 日韩一区二区三区资源| 老司机在线视频二区| 亚洲精品中文字幕乱码三区| 黄色一级片黄色| 欧美调教sm| 欧美日韩久久久一区| 中国老熟女重囗味hdxx| 林ゆな中文字幕一区二区| 亚洲精品中文字幕av| 长河落日免费高清观看| 国产精品成人一区二区网站软件| 91av在线免费观看| 做爰视频毛片视频| 国产精一区二区三区| 国产精品制服诱惑| 国产高清视频在线| 亚洲精品国产精品乱码不99| 日本不卡在线观看视频| 欧美一级网址| 亚洲第一区在线| 美国黄色特级片| 国产一区欧美| 国产精品亚洲视频在线观看| 亚洲av无码国产精品久久不卡| 久久人人爽爽爽人久久久| 潘金莲一级淫片aaaaaa播放1| 僵尸再翻生在线观看免费国语| 91久久线看在观草草青青| 国模大尺度视频| 精品国产91| 欧美激情亚洲精品| 怡红院男人的天堂| 99视频精品免费视频| 五月婷婷一区| 日韩伦理精品| 日韩欧美在线观看一区二区三区| 亚洲欧美日本一区| 综合在线视频| 国产精品直播网红| 色视频精品视频在线观看| 亚洲色图另类专区| 免费av网址在线| 亚洲一区二区三区在线免费| 在线观看日韩av| 99热只有这里有精品| 国产精品影视在线| 一个色的综合| 久久久成人av毛片免费观看| 欧美精品一区二| 亚洲一级生活片| 蜜臀久久久久久久| 欧美中日韩一区二区三区| 成人爽a毛片免费啪啪动漫| 欧美猛男男办公室激情| 亚洲一区视频在线播放| 国产精品一页| 国产日韩精品一区观看| 最新av在线播放| 欧美精品vⅰdeose4hd| 男人的天堂av网| 久久久久国产精品一区三寸| 久久99国产精品99久久| 7777kkk亚洲综合欧美网站| 欧美v亚洲v综合ⅴ国产v| 天天看天天摸天天操| 久久精品久久久精品美女| 日本一区免费| 婷婷综合六月| 亚洲人在线视频| 中文字幕精品视频在线观看| 91麻豆6部合集magnet| 成年人视频观看| 婷婷亚洲精品| 国产97在线|日韩| 久草在现在线| 欧美视频在线一区| 久久一级免费视频| 国精产品一区一区三区mba视频| 亚洲一区二区在线免费观看| www.精品国产| 久久亚洲一区二区三区四区五区高| 97超碰资源站| 亚洲精品久久嫩草网站秘色| 先锋资源在线视频| 在线欧美日韩| 免费av一区二区三区| 免费亚洲电影| 色吧影院999| www.欧美国产| 香蕉成人伊视频在线观看| 久久久午夜精品福利内容| 国产女优一区| 欧洲视频一区二区三区| 久久精品超碰| 欧美日韩国产123| 无码国产精品一区二区免费16| 欧美日韩在线免费观看| 日韩精品电影一区二区三区| 国产主播一区二区三区| 免费av手机在线观看| 男男gay无套免费视频欧美| 国产精品爽黄69天堂a| 日本高清在线观看wwwww色| 欧美大黄免费观看| 日本特级黄色片| 国产精品久久久一本精品| 色欲无码人妻久久精品| 亚洲一级在线| 91免费视频黄| 一区二区小说| 亚洲精品女av网站| 天堂av在线| 日韩视频在线观看免费| 六月丁香色婷婷| 91黄视频在线观看| 免费毛片在线播放免费 | 国产伦精品一区二区三区| 91久久国产综合久久91猫猫| 精品国产欧美成人夜夜嗨| 午夜成人免费影院| 91精品免费在线观看| 日韩少妇高潮抽搐| 18成人在线观看| 一出一进一爽一粗一大视频| 久久av资源站| 国产精品97在线| 自拍偷拍欧美专区| 日韩精品大片| 老司机精品在线| 亚洲精品欧美日韩专区| 美女福利一区二区三区| 精品中文字幕乱| 中文日本在线观看| 亚洲精品久久久久中文字幕二区 | 涩涩涩在线视频| 久久精品国产99国产精品澳门 | 天堂网中文字幕| 一区二区三区在线视频观看| 久久中文字幕精品| 99re热这里只有精品视频| 青青草原播放器| 奇米精品一区二区三区在线观看 | heyzo在线欧美播放| 日韩在线视频二区| 国产黄色免费在线观看| 亚洲精品国产精品国产自| 国产美女免费视频| 欧美日韩国产欧美日美国产精品| 亚洲精品男人的天堂| 亚洲不卡av一区二区三区| 特级片在线观看| 亚洲日本一区二区| 99久久99久久精品免费看小说.| 99久久亚洲一区二区三区青草| 日本中文字幕精品| 国产一区二区三区免费看 | 免费在线精品视频| 成久久久网站| 日韩国产精品一区二区三区| 欧美日韩123| 欧美高清性xxxxhdvideosex| 九九热播视频在线精品6| 动漫精品视频| 伊人久久大香线蕉av超碰| 亚洲va欧美va在线观看| 麻豆国产精品| 2014国产精品| 老司机亚洲精品一区二区| 亚洲一区二区三区四区在线播放 | 日本不卡一区视频| 国产欧美日韩久久| 天天舔天天操天天干| 久久九九99视频| 自拍偷拍视频亚洲| 日本一区二区综合亚洲| 国产调教在线观看| 国产精品欧美一级免费| 免费看一级大片| 亚洲人成网站在线| 午夜爱爱毛片xxxx视频免费看| 亚洲欧美一区二区三区久本道91| 欧美激情图片小说| 亚洲最新视频在线观看| 日本一区二区欧美| 日韩欧美一区二区在线| 黄色大全在线观看| 4438亚洲最大| 成人毛片视频免费看| 日韩精品在线免费播放| 国产youjizz在线| yellow中文字幕久久| 伊人福利在线| 97在线视频免费| 少妇一区视频| 国产在线观看不卡| 一区二区三区视频播放| 狠狠色噜噜狠狠色综合久| 精品久久久久久久久久久下田| 亚洲精品一区二区三区蜜桃久| 我不卡影院28| 免费看日本毛片| 日本不卡一区二区三区| 女人扒开双腿让男人捅| 久久一区二区视频| 日本一二三区在线观看| 无码av免费一区二区三区试看| 丁香社区五月天| 欧美一级夜夜爽| 日韩私人影院| 久久中文字幕视频| 亚洲精品中文字幕| 亚洲影院污污.| 亚洲v天堂v手机在线| 综合国产精品久久久| 国产欧美成人| 激情久久综合网| 99久久精品费精品国产一区二区| 蜜桃久久精品成人无码av| 一区二区三区中文字幕在线观看| 日韩在线视频免费播放| 欧美一区二区在线免费播放| 狠狠躁日日躁夜夜躁av| 最近2019中文字幕第三页视频| 高h视频在线播放| 国产精品揄拍一区二区| 日韩欧美美女在线观看| 日韩不卡一二区| 日韩中文字幕亚洲一区二区va在线 | 国产原创在线观看| 日av在线播放中文不卡| 日本精品在线播放 | 欧美有码视频| 激情网站五月天| 成人做爰69片免费看网站| 欧美性受xxxx黑人| 日韩欧美精品免费在线| 丰满少妇高潮在线观看| 久久久999精品免费| 欧美日韩免费看片| 久久精彩视频| 亚洲国产国产亚洲一二三| 中文字幕第三区| 国产精品护士白丝一区av| 青青草成人av| 欧美精品一区二区在线观看| 国产色在线观看| 国产精品视频一区二区高潮| 亚洲第一福利专区| 日韩网站在线免费观看| 国产成人亚洲综合色影视| 人与动物性xxxx| 欧美日本在线播放| 91电影在线播放| 国产精品自产拍在线观看| 国产一区二区三区四区| 97国产精东麻豆人妻电影 | 青春草在线视频| 91免费国产网站| 99久久婷婷这里只有精品| 亚洲综合色在线观看| 欧美国产一区二区在线观看| 免费看一级视频| 亚洲午夜激情免费视频| 黄瓜视频成人app免费| 久久伊人资源站| 香蕉av777xxx色综合一区| 香港三日本8a三级少妇三级99| 亚洲制服丝袜一区| 国模私拍视频在线| 欧美极品少妇xxxxⅹ喷水| xvideos.蜜桃一区二区| aa视频在线播放| 91欧美激情一区二区三区成人| 男女啊啊啊视频| 亚洲午夜国产成人av电影男同| 亚洲成人av观看| 亚洲人成人77777线观看| 麻豆91精品91久久久的内涵| 亚洲欧美综合7777色婷婷| 69堂精品视频| 欧洲黄色一区| 久久久久久九九| 视频一区二区国产| 日本不卡一区视频| 欧美一级xxx| 国产污视频在线播放| 开心色怡人综合网站| 丝袜美腿亚洲一区二区图片| 在线观看免费小视频| 欧美日本在线播放| 蜜乳av一区| 激情五月综合色婷婷一区二区| 久久xxxx| 羞羞在线观看视频| 亚洲精品一线二线三线无人区| 美女高潮视频在线看| 亚洲精品二区| 国产成人8x视频一区二区| 日韩免费视频一区二区视频在线观看| 国产亚洲成精品久久| 成人黄色91| 怡红院av亚洲一区二区三区h| 国产日产欧美一区| 国产黄色av网站| 欧美亚洲视频一区二区| 全球成人免费直播| 在线观看免费视频国产| 日本韩国一区二区| 午夜毛片在线| 国内精品二区| 久久精品国产亚洲高清剧情介绍| 国产在线免费视频| 亚洲最新中文字幕| eeuss鲁片一区二区三区| av无码精品一区二区三区| 一区二区三区日韩| 久久电影中文字幕| av在线亚洲男人的天堂| 日韩国产成人精品| 国产奶水涨喷在线播放| 中文字幕免费精品一区高清| 凹凸成人在线| www,av在线| 在线观看av一区二区|