亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有關java泛型中一段簡單代碼 擦除知識點的疑問

有關java泛型中一段簡單代碼 擦除知識點的疑問

皈依舞 2019-03-06 15:15:16
下面這個程序中T 類型不是被擦除了嗎?為什么使用get ( ) 方法不需要類型裝換? (不適用泛型的簡單代碼就需要加(String) 來實現類型轉換)擦除知識點在實際編程中體現的多嗎?代碼如下:public class GenericHolder<T> {  private T obj;  public void set(T obj) { this.obj = obj; }  public T get() { return obj; }  public static void main(String[] args) {    GenericHolder<String> holder =      new GenericHolder<String>();    holder.set("Item");    String s = holder.get();  }}public class SimpleHolder {  private Object obj;  public void set(Object obj) { this.obj = obj; }  public Object get() { return obj; }  public static void main(String[] args) {    SimpleHolder holder = new SimpleHolder();    holder.set("Item");    String s = (String)holder.get();  }}
查看完整描述

6 回答

?
holdtom

TA貢獻1805條經驗 獲得超10個贊

擦除是指運行時在泛型類內部無法得到有關泛型參數的任何信息, 如果指定了邊界,泛型變量的實際類型就是邊界,樓主示例中的代碼沒有指定邊界, 所以擦出到Object, 也就是obj實際運行時的類型為Object, 之所以使用get()方法不需要強制類型轉換, 是因為編譯期在編譯時幫你生成了轉換的代碼, 如果我沒記錯的話, 大概處理之后的情況和示例2的main方法中的String s = (String)holder.get()類似, 詳細的樓主可以用javap 反編譯查看.

對于第二個問題, 我覺著這就和看不看源碼是一個道理, 不看也不影響編程, 但是看過之后明白了, 寫起來會很得心應手, 我還是學生, 實際編程的情況就不知道啦, 一點點看法~


查看完整回答
反對 回復 2019-04-17
?
慕妹3146593

TA貢獻1820條經驗 獲得超9個贊

泛型只在源碼中體現,編譯后等同于你舉例的后者。所以pubic void test(List<String> list)和public void test(List<Integer> list)不能實現重載。


查看完整回答
反對 回復 2019-04-17
?
ABOUTYOU

TA貢獻1812條經驗 獲得超5個贊

  1. 擦除是在編譯期擦除,將 java 文件編譯為 class 文件時擦除。java 的泛型,可以看成一種語法糖,使得我們在書寫java代碼時更安全便捷。

  2. 擦除在實際工作中沒有用到,擦除可以認為是泛型語法糖在編譯期的一種解釋動作。


查看完整回答
反對 回復 2019-04-17
?
瀟瀟雨雨

TA貢獻1833條經驗 獲得超4個贊

1.首先,擦除通俗的說是指泛型標簽是交給Javac編譯器去執行的,并起作用的。 代碼過完編譯期,運行期間就不管了《T》,在class文件找不到T了。 這里你顯示了指明了類型是<String>,那么編譯器會在編譯期間將GenericHolder中持有的T轉換成String類型。 所以你的get不用轉型了(編譯器已經把String識別出來了)。

2.擦除是泛型中很重要的概念,可以說不懂擦除就不懂泛型。實際工作中有常見有關聯的是對象的序列化反序列化,如gson等框架中會用到。


查看完整回答
反對 回復 2019-04-17
?
精慕HU

TA貢獻1845條經驗 獲得超8個贊

GenericHolder<String> 中的


private T obj;

public void set(T obj) { this.obj = obj; }

public T get() { return obj; }

相當于


private Object obj;

public void set(Object obj) { this.obj = obj; }

public Object get() { return (Object) obj; }

...

String s = (String) holder.get();

其實就是個語法糖


查看完整回答
反對 回復 2019-04-17
  • 6 回答
  • 0 關注
  • 402 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號