6 回答

TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超10個贊
擦除是指運(yùn)行時在泛型類內(nèi)部無法得到有關(guān)泛型參數(shù)的任何信息, 如果指定了邊界,泛型變量的實(shí)際類型就是邊界,樓主示例中的代碼沒有指定邊界, 所以擦出到Object, 也就是obj實(shí)際運(yùn)行時的類型為Object, 之所以使用get()方法不需要強(qiáng)制類型轉(zhuǎn)換, 是因?yàn)榫幾g期在編譯時幫你生成了轉(zhuǎn)換的代碼, 如果我沒記錯的話, 大概處理之后的情況和示例2的main方法中的String s = (String)holder.get()
類似, 詳細(xì)的樓主可以用javap 反編譯查看.
對于第二個問題, 我覺著這就和看不看源碼是一個道理, 不看也不影響編程, 但是看過之后明白了, 寫起來會很得心應(yīng)手, 我還是學(xué)生, 實(shí)際編程的情況就不知道啦, 一點(diǎn)點(diǎn)看法~

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超9個贊

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個贊
擦除是在編譯期擦除,將 java 文件編譯為 class 文件時擦除。java 的泛型,可以看成一種語法糖,使得我們在書寫java代碼時更安全便捷。
擦除在實(shí)際工作中沒有用到,擦除可以認(rèn)為是泛型語法糖在編譯期的一種解釋動作。

TA貢獻(xiàn)1833條經(jīng)驗(yàn) 獲得超4個贊
1.首先,擦除通俗的說是指泛型標(biāo)簽是交給Javac編譯器去執(zhí)行的,并起作用的。 代碼過完編譯期,運(yùn)行期間就不管了《T》,在class文件找不到T了。 這里你顯示了指明了類型是<String>,那么編譯器會在編譯期間將GenericHolder中持有的T轉(zhuǎn)換成String類型。 所以你的get不用轉(zhuǎn)型了(編譯器已經(jīng)把String識別出來了)。
2.擦除是泛型中很重要的概念,可以說不懂擦除就不懂泛型。實(shí)際工作中有常見有關(guān)聯(lián)的是對象的序列化反序列化,如gson等框架中會用到。

TA貢獻(xiàn)1845條經(jīng)驗(yàn) 獲得超8個贊
GenericHolder<String> 中的
private T obj;
public void set(T obj) { this.obj = obj; }
public T get() { return obj; }
相當(dāng)于
private Object obj;
public void set(Object obj) { this.obj = obj; }
public Object get() { return (Object) obj; }
...
String s = (String) holder.get();
其實(shí)就是個語法糖
添加回答
舉報