List<String>里面放int數(shù)據(jù)

我今天被愛學(xué)習(xí)的同學(xué)問到了如何在List<String>里面放一個int的數(shù)據(jù)

比如

List<String> list = new ArrayList<String>();
int a = 1;
list.add(a);

這樣寫肯定報錯了。毫無疑問。
先不管為什么他要給我來一個不合理的問題。先管實現(xiàn)。
這里我首先考慮到一個事情,泛型是什么,不加泛型的話

List list = new ArrayList();
int a = 1;
String str = "1"
list.add(a);
list.add(str);

是不會報錯的。
那么泛型這個到底做了啥?
深究是不可能的,這輩子都不想去深究。
但是綜合經(jīng)驗來看。
這是一個語法糖。
所謂語法糖,只是方便程序員寫的,減少異常出現(xiàn)可能性等的一個手段,實際上編譯器最后會把語法糖廢掉,并用基礎(chǔ)的方式去搞
如果把編譯好的自己碼.class文件拿去反編譯,你會發(fā)現(xiàn)

List<String> list = new ArrayList<String>();
String a= "1"
list.add(a);

編譯,并反編譯,下面是反編譯的結(jié)果

    List list = new ArrayList();
    String a = "1";
    list.add(a);

是的,<String>被廢了,當(dāng)我添加一個數(shù)據(jù)獲取操作的時候,計算長度

list.get(0).length();

編譯,并反編譯,下面是反編譯的結(jié)果

    ((String)list.get(0)).length();

嗯,原來如此,看到了吧。編譯器給我們來了一個(String)的類型轉(zhuǎn)換。
那么

  List list = new ArrayList();
        String a= "1";
        list.add(a);
        ((String) list.get(0)).length();

這段代碼的編譯結(jié)果和上面那段的一樣,也就是少了<String>泛型約束,多了(String)類型轉(zhuǎn)換。稍加思考,你會懂得的。

所以如何在List<String>里放int呢?
通過上面的分析,我們可以得出某種結(jié)論:用了泛型,經(jīng)過編譯器后,會出現(xiàn)”類型擦除“的現(xiàn)象,并添加強制類型轉(zhuǎn)換的操作。
那么,如果我自己做類型擦出呢?
這里有個故事,昨天晚上我想到用反射,嗯,成功了,于是我今天來寫文章,但是剛剛寫著寫著,我,發(fā)現(xiàn),類型擦除,并不需要反射,看代碼

    1   List<String> list = new ArrayList<String>();
    2   list.add("str");
    3   List list2 = list;
    4   list2.add(1);
    5   System.out.println(list);
    6   System.out.println((int)((Object)list.get(1))+1);

第一行我聲明一個泛型List<String> list
第二行給list添加一個字符串,目的是做參照
第三行生么一個無泛型的 List list2 ,并讓他=list,注意,這里是地址引用,也就是list2和list指向同一個對象地址空間!(細(xì)節(jié)百度,不長篇大論)
第四行給list2放一個int類型的數(shù)字
然后打印list,發(fā)現(xiàn),塞進(jìn)去了?


image.png

并且做數(shù)學(xué)運算成功了?
看下字節(jié)碼反編譯:

List list = new ArrayList();
    list.add("str");
    List list2 = list;
    list2.add(Integer.valueOf(1));
    System.out.println(list);
    System.out.println(((Integer)list.get(1)).intValue() + 1);

他做了啥呀,list的類型擦除,lsit2添加int,list.get(1)的一系列操作。
再解釋就不對了,我本來只想說怎么放的,幾行代碼的事情,一時興起就搞一下編譯器相關(guān),順便優(yōu)化了昨天反射的方法,還不錯,所謂的溫故而知新。古人誠不欺我!

理解這個需要
java語法(寫了這么多年)
懂得jvm內(nèi)存原理(我一知半解)
編譯器原理(我猜的)
我的程序員守則(我先管實現(xiàn),再管你和不合理,傻逼要在List<String>里面放int,這違背了java語言泛型的設(shè)計初衷,不過他說這是某教學(xué)視頻的課后習(xí)題)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容